为什么 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_VALUE
和 1
。然后值再次溢出到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
添加到结果中。
2147483648
的表示如下:
10000000000000000000000000000000
反相产生
01111111111111111111111111111111
添加1
使其再次相同,即
10000000000000000000000000000000
由于整数溢出。
考虑以下 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_VALUE
和 1
。然后值再次溢出到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
添加到结果中。
2147483648
的表示如下:
10000000000000000000000000000000
反相产生
01111111111111111111111111111111
添加1
使其再次相同,即
10000000000000000000000000000000
由于整数溢出。