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

Why does the negative of Integer.MIN_VALUE give the same value?

考虑以下 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?内部发生了什么样的位运算?

当您否定 -2147483648 时,它解析为 2147483648,这超过了 Integer.MAX_VALUE1。然后值再次溢出到Integer.MIN_VALUE

来自JLS

The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers.

因此,对整数执行的每个一元运算实际上将应用于数字的二进制补码表示。 当达到 Integer.MAX_VALUE 时,它将由前导 0 和 31 1 位组成。添加 1 将使其成为前导 1 和 31 尾随 0 的数字,这实际上是 Integer.MIN_VALUE.

的二进制补码表示

What kind of bit-wise operations are happening internally?

Java 使用 two's complement 表示有符号数。因此,变号操作,分为两步:

  1. 反转原始值的位,并且
  2. 1 添加到结果中。

2147483648的表示如下:

10000000000000000000000000000000

反相产生

01111111111111111111111111111111

添加1使其再次相同,即

10000000000000000000000000000000

由于整数溢出。