Java整数Min_Value为负,然后比较

时间:2012-09-21 17:13:05

标签: 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);
      }
}

输出:-2147483648 -2147483648

为什么打印2个相同幅度的负数而不是正数和负数?

4 个答案:

答案 0 :(得分:35)

由于无提示整数溢出:Integer.MIN_VALUE-2^31Integer.MAX_VALUE2^31-1,因此-Integer.MIN_VALUE2^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。零在序列的非负数中,并且您有一个负数不能正确地求反。