Qui*_*nma 16 java variables integer negative-number
我明天有一个测试,我无法理解我的书籍解释,我很感激帮助:
public class TestClass{
public static void main(String[] args) throws Exception{
int a = Integer.MIN_VALUE;
int b = -a;
System.out.println( a+ " "+b);
}
}
Run Code Online (Sandbox Code Playgroud)
输出: -2147483648 -2147483648
为什么这会打印2个相同幅度的负数而不是正数和负数?
ass*_*ias 35
因为静默整数溢出:Integer.MIN_VALUE是-2^31和Integer.MAX_VALUE是2^31-1,所以-Integer.MIN_VALUE是2^31,Integer.MAX_VALUE + 1根据定义,它对于整数来说太大了.所以它溢出并成为Integer.MIN_VALUE......
您还可以检查:
System.out.println(Integer.MAX_VALUE + 1);
Run Code Online (Sandbox Code Playgroud)
打印相同的东西.
从技术上讲,结果由Java语言规范#15.18.2定义:
如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示.如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同.
基本上,因为Integer.MAX_VALUE实际上只有 2147483647,所以-Integer.MIN_VALUE,即 +2147483648,实际上溢出了整数内部二进制表示的容量。因此,结果“循环”回到Integer.MIN_VALUE, 或 -2147483648。
如果你这样做了long b = -((long)a);,你会得到预期的结果。