取0x80000000
的二进制代码,我们得到
1000 0000 0000 0000 0000 0000 0000 0000
这如何等于
-2147483648
。我在这个程序中遇到了这个问题。class a
{
public static void main(String[] args)
{
int a = 0x80000000;
System.out.printf("%x %d\n",a,a);
}
}
meow@VikkyHacks:~/Arena/java$ java a
80000000 -2147483648
编辑我了解到2的补码用于表示负数。当我尝试将此等于1的补码时
1's Comp. :: 0111 1111 1111 1111 1111 1111 1111 1111
2's Comp. :: 1000 0000 0000 0000 0000 0000 0000 0000
这又没有任何意义,
0x80000000
如何等于-2147483648
最佳答案
基本上,这就是signed integer overflow发生的情况。
以byte
为例更简单。 byte
值始终在-128到127(含)范围内。因此,如果将值加1,则值为127
(即0x7f),则得到-128。如果将128(0x80)转换为byte
,也可以得到以下结果:
int x = 0x80; // 128
byte y = (byte) x; // -128
溢出(以2s补码整数表示)始终从最高可表达数字到最低可表达数字。
对于无符号类型,最大值溢出到0(再次是最低可表示数字)。这在Java中很难显示,因为唯一的无符号类型是
char
:char x = (char) 0xffff;
x++;
System.out.println((int) x); // 0