我正在尝试用位实现错误代码。就像:
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
答案 0 :(得分:2)
因为0x80000000
是十六进制int
,其溢出Integer.MAX_VALUE
,而0x80000000l
是long
并且不会溢出。
答案 1 :(得分:1)
在java中,int
和Integer
已签名,并使用31位来存储正值。
2147483648
大于Integer.MAX_VALUE,因为它需要超过31位才能存储它。
Long
和long
使用63位来存储正值。因此,2147483648
可以用long
表示。
答案 2 :(得分:0)
你首先显示一个int,然后是一个长的。
32位与64位,2位补码。
答案 3 :(得分:0)
您遇到的是整数溢出。有符号整数可以表示的最大数字是0x7FFFFFFF
,因为在两个补码0x80000000 = -2147483648
中。
如果最高有效位设置为二进制补码整数,则表示该数字为负数,0x80000000 = -2147483648
和0xFFFFFFFF = -1
。
Long可以显示更高的数字。那里只有0x7FFFFFFFFFFFFFFF = -9223372036854775808