java - 0x80000000 在 Java 中如何等同于 -2147483648?

标签 java bit

获取 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/

相关文章:

python - 如何在 python 中将长二进制字符串转换为整数? (基础 > 36)

c - 位域的设置和重置

java - setHeader 不改变文件名

java - 如何强制派生类在多层调用父类(super class)方法?

java - 设置JPanel的大小

c - 二进制文件和文本文件在存储方面的区别?

algorithm - 从一组中的 2 个数字的组合生成非冲突随机数?

将两个 8 位整数合并为一个 16 位整数

java - PowerMockito : mock private method to throw private class

java - 如何在Java中将keyPress变成大写?