Java整数Min_Value为负,然后比较

我明天有考试,我无法理解我的书籍解释,我很感激帮助:

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个相同幅度的负数而不是正数和负数?

由于无提示整数溢出: 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); 

打印相同的东西。

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

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

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

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

为了更清楚地表明这一点:

 
Integer.MIN_VALUE is -2^31 = -2147483648
Integer.MAX_VALUE is 2^31-1 = 2147483647 /*notice this is 1 less than the negative value above*/

1Integer.MAX_VALUE不能占用2147483648 。 对于整数而言,这个数字太大了恰好为1.这会导致数字从最大值返回到最小值的起始值。