可能重复:
Java 如何处理整数下溢和上溢以及如何检查?
System.out.println(4*2147483647) 在java中如何等于-4?
我想知道为什么会这样:
2 * Integer.MAX_VALUE == -2
我期待着你的回应。
可能重复:
Java 如何处理整数下溢和上溢以及如何检查?
System.out.println(4*2147483647) 在java中如何等于-4?
我想知道为什么会这样:
2 * Integer.MAX_VALUE == -2
我期待着你的回应。
那是因为整数溢出。
Integer.MAX_VALUE
是0x7FFFFFFF
。乘以 2 就可以得到0xFFFFFFFE
(相当于左移一位)。这是一个负数(第一位是 1)并且是 的二进制表示-2
。
这是因为二进制补码,其中最左边的位用于表示数字是正数 (0) 还是负数 (1)。因此,当您自己添加 max int (相当于乘以 2)时,会发生这种情况:
011111111111111111111111
+ 011111111111111111111111
__________________________
111111111111111111111110
并且111111111111111111111110
代表-2。
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。