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)
| 归档时间: |
|
| 查看次数: |
14745 次 |
| 最近记录: |