有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么0x8000000及其长格式不同?

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

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) 个答案

  1. # 1 楼答案

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

    2147483648大于整数。最大值,因为它需要超过31位来存储它

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

  2. # 2 楼答案

    因为0x80000000是一个十六进制int,它溢出Integer.MAX_VALUE,而0x80000000l是一个long,不会溢出

  3. # 3 楼答案

    您正在经历的是整数溢出。有符号整数可以表示的最大数是0x7FFFFFFF,因为在二的补码中0x80000000 = -2147483648

    如果最高有效位是在2的补码整数中设置的,这意味着该数字是负数,带有0x80000000 = -21474836480xFFFFFFFF = -1

    Long可以显示更高的数字。在那里你只能在0x7FFFFFFFFFFFFFFF = -9223372036854775808得到一个溢出

  4. # 4 楼答案

    首先显示int,然后是long

    32位对64位,2的补码