java为什么0x8000000及其长格式不同?
我正在尝试用位实现错误代码。就像:
public static final long ERROR_1 = 0x1;
public static final long ERROR_2 = 0x2;
public static final long ERROR_3 = 0x4;
public static final long ERROR_4 = 0x8;
.
.
.
但是当我添加0x80000000
时,输出是-2147483648
。如果将值更改为0x80000000l
,则输出为2147483648
。我很困惑。有人能解释一下为什么输出不同,我应该使用哪一种
System.out.println(0x80000000); //-2147483648
System.out.println(0x80000000l); //2147483648
# 1 楼答案
在java中,
int
和Integer
是有符号的,使用31位来存储正值2147483648
大于整数。最大值,因为它需要超过31位来存储它Long
和long
使用63位存储正值。因此2147483648
可以用long
表示# 2 楼答案
因为
0x80000000
是一个十六进制int
,它溢出Integer.MAX_VALUE
,而0x80000000l
是一个long
,不会溢出# 3 楼答案
您正在经历的是整数溢出。有符号整数可以表示的最大数是
0x7FFFFFFF
,因为在二的补码中0x80000000 = -2147483648
如果最高有效位是在2的补码整数中设置的,这意味着该数字是负数,带有
0x80000000 = -2147483648
和0xFFFFFFFF = -1
Long可以显示更高的数字。在那里你只能在
0x7FFFFFFFFFFFFFFF = -9223372036854775808
得到一个溢出# 4 楼答案
首先显示int,然后是long
32位对64位,2的补码