9

取二进制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

4

3 回答 3

19

基本上,这就是有符号整数溢出所发生的情况。

byte举个例子比较简单。值byte始终在 -128 到 127(含)范围内。所以如果你有一个值127(即 0x7f),如果你加 1,你会得到 -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
于 2013-09-15T15:25:07.177 回答
1

就数据类型的范围而言,当存在溢出时就是这种情况。这是我可以分享的一个例子。

int number = 0x80; // 0x80 is hexadecimal for 128 (decimal)
byte castedNumber = (byte)(number); // On casting, there is overflow,as byte ranges from -128 to 127 (inclusive).
System.out.println(castedNumber); //Output is -128.
于 2016-08-02T06:01:24.990 回答
0

Java 的整数范围是 -2,147,483,648 到 2,147,483,647 给定的是十六进制 val 0x80000000,其等效十进制值为2,147,483,648(1 的补码转换)。您可以看到十进制值不在称为整数溢出的范围内。每当发生溢出时,它会自行绕到另一端,在这种情况下为 -2,147,483,648。

于 2021-03-08T16:59:46.817 回答