考虑下面的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
?内部发生了什么样的按位操作?
答案 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
添加到结果中。 2147483648
的代表如下所示:
10000000000000000000000000000000
反转它会产生
01111111111111111111111111111111
添加1
再次使它成为相同的数字,即
10000000000000000000000000000000
由于整数溢出。