为什么2 * Integer.MAX_VALUE = -2?

时间:2012-10-23 17:41:35

标签: java

  

可能重复:
  How does Java handle integer underflows and overflows and how would you check for it?
  How is System.out.println(4*2147483647) equal to -4 in java?

我想知道为什么会这样:

2 * Integer.MAX_VALUE == -2

我期待着你的回复。

5 个答案:

答案 0 :(得分:6)

你得到这个结果是因为integer overflow:在表示负整数的two's complement系统中,取最大值为011.....11 2 并乘以它由2为您提供11.....110 2 ,与-2对应。

答案 1 :(得分:1)

那是因为整数溢出。

答案 2 :(得分:1)

Integer.MAX_VALUE0x7FFFFFFF。乘以2得到0xFFFFFFFE(相当于左移一位)。这是一个负数(第一位是1),是-2的二进制表示。

答案 3 :(得分:1)

这是因为二进制补码,其中lef最多位用于表示数字是正数(0)还是负数(1)。所以当你自己添加max int(相当于multiplfy的两个)时,会发生这种情况:

  011111111111111111111111
+ 011111111111111111111111
__________________________
  111111111111111111111110

111111111111111111111110代表-2。

答案 4 :(得分:0)

Int的MAX_VALUE是2 ^ 31-1 = 2147483647 = 0111 1111 1111 1111 1111 1111 1111 1111(二进制数)最高位(这里是第一位0,表示整数是正数,当1表示负

(假设整数的长度是4字节),2 * MAX_VALUE,在计算机中,整数乘2次左移位(运算符<<<>),例如。 2<< 1 = 4; 2<< 2 = 8;所以0111 1111 1111 1111 1111 1111 1111 1111<< 1成为1111 1111 1111 1111 1111 1111 1111 1110,等于-2的十进制。