为什么Integer.MIN_VALUE的负数给出相同的值?

时间:2015-07-21 13:27:18

标签: java operators bitwise-operators ones-complement

考虑下面的java代码。

Integer value = Integer.MIN_VALUE;
System.out.println(value);

value = -value;
System.out.println(value);

输出

-2147483648
-2147483648

Integer.MIN_VALUE值的负值如何产生相同的值?

但是结果不能是2147483648,因为java中Integer的最大值是2147483647

但想知道为什么-2147483648?内部发生了什么样的按位操作?

2 个答案:

答案 0 :(得分:13)

当您否定-2147483648时,它会解析为2147483648,超过Integer.MAX_VALUE 1。然后该值再次溢出到Integer.MIN_VALUE

来自JLS

  

整数类型是byte,short,int和long,其值为8位,16位,32位和64位带符号的二进制补码整数。

因此,对整数执行的每个一元运算实际上都将应用于数字的二进制补码表示。 达到Integer.MAX_VALUE时,它将包含前导0和31 1位。添加1会使其成为一个带有前导1和31后跟0的数字,这实际上是Integer.MIN_VALUE的两个补码表示。

答案 1 :(得分:12)

  

内部发生了什么样的按位操作?

Java使用已签名号码的two's complement表示。因此,符号操作的改变包括两个步骤:

  1. 反转原始值的位,
  2. 1添加到结果中。
  3. 2147483648的代表如下所示:

    10000000000000000000000000000000
    

    反转它会产生

    01111111111111111111111111111111
    

    添加1再次使它成为相同的数字,即

    10000000000000000000000000000000
    

    由于整数溢出。