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

vik*_*cks 8 java bits

0x80000000拿二进制我们得到

1000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

这等同于什么-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
Run Code Online (Sandbox Code Playgroud)

编辑我了解到2的补码用于表示负数.当我试图把它与1的补码相等时

1's Comp. :: 0111 1111 1111 1111 1111 1111 1111 1111
2's Comp. :: 1000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

这也没有任何意义,0x80000000等同于什么-2147483648

Jon*_*eet 19

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

byte以一个例子来说更简单.甲byte值总是在范围-128到127(含).因此,如果你有一个值127(即0x7f),如果你加1,你得到-128.如果您将128(0x80)转换为byte:

int x = 0x80; // 128
byte y = (byte) x; // -128
Run Code Online (Sandbox Code Playgroud)

溢出(2s补码整数表示)总是从最高可表示数字到最低表示数字.

对于无符号类型,最高值溢出为0(这也是最低可表示数字).这在Java中很难显示,因为唯一的无符号类型是char:

char x = (char) 0xffff;
x++;
System.out.println((int) x); // 0
Run Code Online (Sandbox Code Playgroud)