明天我有一个考试,我无法理解我的书籍解释,我很感激帮助:
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个相同幅度的负数而不是正数和负数?
答案 0 :(得分:35)
由于无提示整数溢出:Integer.MIN_VALUE
为-2^31
且Integer.MAX_VALUE
为2^31-1
,因此-Integer.MIN_VALUE
为2^31
,即Integer.MAX_VALUE + 1
1}},根据定义,对于整数来说太大了。所以它溢出并成为Integer.MIN_VALUE
...
您还可以检查:
System.out.println(Integer.MAX_VALUE + 1);
打印相同的东西。
从技术上讲,结果由Java Language Specification #15.18.2:
定义如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。
答案 1 :(得分:4)
基本上,因为Integer.MAX_VALUE
实际上只有2147483647,所以-Integer.MIN_VALUE
,即+2147483648,实际上溢出了整数的内部二进制表示的容量。因此,结果“循环”回到Integer.MIN_VALUE
或-2147483648。
如果你做了long b = -((long)a);
,那么你会得到预期的结果。
答案 2 :(得分:1)
更清楚地表明这一点:
<br>
Integer.MIN_VALUE is -2^31 = -2147483648<br>
Integer.MAX_VALUE is 2^31-1 = 2147483647
/*notice this is 1 less than the negative value above*/
<br>
1Integer.MAX_VALUE
无法接受2147483648
。对于整数而言,这个数字太大了恰好为1.这会导致数字从最大值返回到最小值的起始值。
答案 3 :(得分:0)
固定数量的二进制位可以编码偶数个事物。这意味着您不能有一个精确地以零为中心的序列,因为这将需要多个事物对称。在句子中间获得零最接近的事情是将其拆分为负数和非负数,或正数和非正数。普通的二进制补码编码是前者。因此,32位的范围从-2 ^ 31到2 ^ 31-1。零在序列的非负数中,并且您有一个负数不能正确地求反。