Java Integer.MIN_VALUE的负数,然后比较产生两个负数

2022-09-02 02:53:11

我明天有一个测试,我无法理解我的书解释,我很感激帮助:

public class TestClass{
      public static void main(String[] args) throws Exception{
            int a = Integer.MIN_VALUE;
            int b = -a;
            System.out.println( a+ "   "+b);
      }
}

输出:-2147483648 -2147483648

为什么打印2个相同大小的负数,而不是正数和负数?


答案 1

由于静默整数溢出:is 和 is ,所以是 ,根据定义,它对于整数来说太大了。所以它溢出并成为...Integer.MIN_VALUE-2^31Integer.MAX_VALUE2^31-1-Integer.MIN_VALUE2^31Integer.MAX_VALUE + 1Integer.MIN_VALUE

您还可以检查:

System.out.println(Integer.MAX_VALUE + 1);

打印相同的内容。

从技术上讲,结果由Java语言规范#15.18.2定义:

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


答案 2

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

如果您这样做,您将获得预期的结果。long b = -((long)a);