Java 为什么0x80000000及其长形式不同?

Java 为什么0x80000000及其长形式不同?,java,bit,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; . . . 但当我添加0x8000000时,输出是-2147483648。如果将值更改为0x8000000L,则输出为2147483648。我

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

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;
.
.
.
但当我添加
0x8000000
时,输出是
-2147483648
。如果将值更改为
0x8000000L
,则输出为
2147483648
。我很困惑。有人能解释一下为什么输出不同,我应该使用哪一种

System.out.println(0x80000000);       //-2147483648
System.out.println(0x80000000l);      //2147483648

因为
0x80000000
是一个十六进制
int
,它会溢出
整数。MAX_值
,而
0x80000000l
是一个
且不会溢出

在java中,
int
Integer
是有符号的,使用31位存储正值

2147483648
大于Integer.MAX_值,因为它需要超过31位来存储它


Long
Long
使用63位存储正值。因此
2147483648
可以用
long
表示,首先显示int,然后是long


32位对64位,2的补码。

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

如果最高有效位设置在2的补码整数中,则表示该数字为负数,
0x8000000=-2147483648
0xffffff=-1


Long可以显示更高的数字。您只能在
0x7fffffffffffffffff=-9223372036854775808处得到一个溢出
。Java使用2的补码,因此最高有效位不仅是符号,而且还反转计数方向并减去1。@Dakkaron Thanke-answer updated