可能重复:
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
我期待着你的回复。
答案 0 :(得分:6)
你得到这个结果是因为integer overflow:在表示负整数的two's complement系统中,取最大值为011.....11
2 并乘以它由2
为您提供11.....110
2 ,与-2
对应。
答案 1 :(得分:1)
那是因为整数溢出。
答案 2 :(得分:1)
Integer.MAX_VALUE
是0x7FFFFFFF
。乘以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的十进制。