This question already has answers here:
How is 0x80000000 equated to -2147483648 in java?
                                
                                    (2个答案)
                                
                        
                                4年前关闭。
            
                    
我试图用位实现错误代码。就像是:

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

最佳答案

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

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

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

09-10 13:44