整数最小值/最大值特有的溢出行为

时间:2013-11-29 09:32:29

标签: java scala jvm

为什么Integer.MIN_VALUE * 2等于0

Integer.MAX_VALUE * 2等于-2

让我更好地解释一下:

我知道它溢出了,但为什么会得到这些特定的结果呢?

3 个答案:

答案 0 :(得分:22)

Integer.MIN_VALUE= -2147483648。看看2 * -2147483648

的位计算
   Integer.MIN_VALUE*2  = Integer.MIN_VALUE+Integer.MIN_VALUE


         -2147483648=  10000000 00000000 00000000 00000000 ->32 bit
                      +10000000 00000000 00000000 00000000 
  _________________________________________________________________
     2* -2147483648= 1 00000000 00000000 00000000 00000000 Result is 0
                     |
                    This bit will be omitted due to limitation of 32 bit

Integer.MAX_VALUE=2147483647,看看2 * 2147483647

的位计算
   Integer.MAX_VALUE*2  = Integer.MAX_VALUE+Integer.MAX_VALUE


          2147483647=  01111111 11111111 11111111 11111111 ->32 bit
                      +01111111 11111111 11111111 11111111 
  _________________________________________________________________
       2* 2147483647=  11111111 11111111 11111111 11111110 Result is -2

答案 1 :(得分:3)

scala> println(Integer.MAX_VALUE)
2147483647

scala> println(Integer.MIN_VALUE)
-2147483648

所以,Integer.MIN_VALUE = - (Integer.MAX_VALUE + 1)

所以,如果MIN_VALUE + MIN_VALUE = 0,那么MAX_VALUE + MAX_VALUE = 0 - 1 - 1 = -2

答案 2 :(得分:1)

在计算机系统中,值以互补码键控表示 积极是自己的补充 补语等于你否定的原始代码的负数的绝对值,以及

的整数1