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

why 0x80000000 and its long form are different?

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

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

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

在java中,intInteger是有符号的,用31位来存储正数。

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

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

您首先显示一个 int,然后是一个 long。

32 位与 64 位,2 的补码。

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

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

Long 可以显示更大的数字。那里你只会在 0x7FFFFFFFFFFFFFFF = -9223372036854775808

处溢出