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