美文网首页
为什么int的最小值绝对值比最大值大1

为什么int的最小值绝对值比最大值大1

作者: 新签名 | 来源:发表于2018-09-03 00:00 被阅读370次

    关于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的可行性,两者都理解起来会更能明白设计者的良苦用心.

    相关文章

      网友评论

          本文标题:为什么int的最小值绝对值比最大值大1

          本文链接:https://www.haomeiwen.com/subject/nfbvwftx.html