获取 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(含)范围内。因此,如果您的值是 127
(即 0x7f),如果您加 1,您将得到 -128。这也是将 128 (0x80) 转换为 byte
时得到的结果:
int x = 0x80; // 128
byte y = (byte) x; // -128
溢出(在 2s 补码整数表示中)总是从最高可表达数到最低数。
对于unsigned 类型,最高值溢出到 0(这又是最低的可表达数)。这在 Java 中更难显示,因为唯一的无符号类型是 char
:
char x = (char) 0xffff;
x++;
System.out.println((int) x); // 0
关于java - 0x80000000 在 Java 中如何等同于 -2147483648?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18813875/