为什么0x80000000和它的长形不同?

时间:2015-06-30 10:49:50

标签: java bit

我正在尝试用位实现错误代码。就像:

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

4 个答案:

答案 0 :(得分:2)

因为0x80000000是十六进制int,其溢出Integer.MAX_VALUE,而0x80000000llong并且不会溢出。

答案 1 :(得分:1)

在java中,intInteger已签名,并使用31位来存储正值。

2147483648大于Integer.MAX_VALUE,因为它需要超过31位才能存储它。

Longlong使用63位来存储正值。因此,2147483648可以用long表示。

答案 2 :(得分:0)

你首先显示一个int,然后是一个长的。

32位与64位,2位补码。

答案 3 :(得分:0)

您遇到的是整数溢出。有符号整数可以表示的最大数字是0x7FFFFFFF,因为在两个补码0x80000000 = -2147483648中。

如果最高有效位设置为二进制补码整数,则表示该数字为负数,0x80000000 = -21474836480xFFFFFFFF = -1

Long可以显示更高的数字。那里只有0x7FFFFFFFFFFFFFFF = -9223372036854775808

的溢出