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^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);
打印相同的东西。
从技术上讲,结果由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.这会导致数字从最大值返回到最小值的起始值。