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

09-28 07:22
查看更多