Java整数Min_Value为负,然后比较

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^31Integer.MAX_VALUE2^31-1,所以-Integer.MIN_VALUE2^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定义:

如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示.如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同.

  • 实现这个问题的另一种方法是使用`Math.abs()`。`Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE` (2认同)

Joã*_*des 5

基本上,因为Integer.MAX_VALUE实际上只有 2147483647,所以-Integer.MIN_VALUE,即 +2147483648,实际上溢出了整数内部二进制表示的容量。因此,结果“循环”回到Integer.MIN_VALUE, 或 -2147483648。

如果你这样做了long b = -((long)a);,你会得到预期的结果。