关于int取值范围的疑问
在Java中int是占4个字节的,意味着它是32位。同时int是有符号的,那就说它最高位不计算在内,可以得出MAX_INT
= 01111111111111111111111111111111 恰好等于 2^31 -1
这里在顺便给出下为什么 01111111111111111111111111111111 = 2^31 -1 转化成一般求10进制的计算式就是 2^0 * 1 + 2^1 * 1 + 2^2 * 1...+2^30 * 1 + 2^31 * 0 根据等比公式 = 2^31 -1 其实想想也是这样的,因为2^1=10, 所以2^31等于32位中第一位是1,其他全0的场景(100000000000000000000),减一也就是01111111111111111111111111111111
ps:在这里犯过傻
说法1:
MAX_INT
+ 1 = 100000000000000000000 根据int有符号的定义,第一位是符号位,这样看来,这个数值就是 -0 ; 那么我们再来讨论这样一种场景,按照int的第一个位是符号位的说法 MIN_INT
=11111111111111111111111111111111,前面我们计算过 31位的全1 = 2^31 -1, 所以MIN_INT
=-2^31 + 1. 这应该是正常思路看待int的最大值和最小值的场景.但是我们还有一个-0没有解决,我们按照之前定义的MIN_INT
来计算一下MIN_INT
-1 = -2^31 + 1 -1 = -2^31. 咦,我们去掉超过的1位,发现它竟然也是 100000000000000000000 和 -0的含义一样 ,所以我们要解决的-0 可以把原来的MIN_INT
-1 作为新的MIN_INT
! 这样int的取值范围就是 -2^31 到 2^31 -1
说法2:
当然,说法1是我发现的一种解释,网上的解释是因为负数在计算机中都是以补码方式存储的,且没有任何正数的补码是 100000000000000000000 ,所以把 -0 看成 int最小值(符号位参与运算).
我觉得这是从正向推理的思维,说法1 是从逆向推理证明说法2的可行性,两者都理解起来会更能明白设计者的良苦用心.
网友评论