9

考虑下面的java代码。

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

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

输出

-2147483648
-2147483648

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

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

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

4

2 回答 2

14

当你否定-2147483648时,它会解析为2147483648,它超过了Integer.MAX_VALUEwith 1。然后值Integer.MIN_VALUE再次溢出。

JLS

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

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

于 2015-07-21T13:28:35.867 回答
14

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

Java 使用二进制补码表示有符号数。因此,改变符号的操作,包括两个步骤:

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

2147483648的表示如下图:

10000000000000000000000000000000

反转它产生

01111111111111111111111111111111

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

10000000000000000000000000000000

由于整数溢出。

于 2015-07-21T13:31:32.643 回答