计算思路有很多更高级的,我这里说一种最死板的思路。
首先我们知道,Java中int占4个字节,也就是32位。32位是什么概念?直接看下面对应关系,简单粗暴,前提你要知道最高位是标志位,0为正数
,1为负数
:
max = 01111111 11111111 11111111 11111111
...
4 = 00000000 00000000 00000000 00000100
3 = 00000000 00000000 00000000 00000011
2 = 00000000 00000000 00000000 00000010
1 = 00000000 00000000 00000000 00000001
0 = 00000000 00000000 00000000 00000000
-1 = 11111111 11111111 11111111 11111111
-2 = 11111111 11111111 11111111 11111110
-3 = 11111111 11111111 11111111 11111101
-4 = 11111111 11111111 11111111 11111100
...
min = 10000000 00000000 00000000 00000000
由上面我们可以知道int的取值范围就是 [10000000 00000000 00000000 00000000 , 01111111 11111111 11111111 11111111]
,
01111111 11111111 11111111 11111111转成十进制容易算,就是2的31次方减1,所以max=21474836487
。
那么10000000 00000000 00000000 00000000转成十进制是多少呢?先了解一下负数的十进制和二进制的转换。
负数十进制转二进制 - 取反加1
取反加1,很简单,比如-666
转成二进制,就是11111111 11111111 11111101 01100110
,如下:
// 首先正数666的二进制是
00000000 00000000 00000010 10011010
// 取反
11111111 11111111 11111101 01100101
// 加1
11111111 11111111 11111101 01100110
负数二进制转十进制 - 减1取反
减1取反,也很简单,比如11111111 11111111 11111100 10001000
转成十进制,就是-888
,如下:
// 二进制原数
11111111 11111111 11111100 10001000
// 减1
11111111 11111111 11111100 10000111
// 取反
00000000 00000000 00000011 01111000
// 转成十进制
888
那么原来的问题,10000000 00000000 00000000 00000000是多少呢
// 原负数
10000000 00000000 00000000 00000000
// 减1
01111111 11111111 11111111 11111111
// 取反
10000000 00000000 00000000 00000000
// 转成十进制
2147483648
所以10000000 00000000 00000000 00000000=-2147483648,
所以min=-2147483648
,前面已经算出max=21474836487
所以int的取值范围就是[-2147483648,21474836487]
,也就是-2的31次方 到 2的31次方减1
。