在确定 Java 如何存储和检索整数时,我遗漏了一些内容。我有以下代码
public class Test1 {
public static void main(String args[]) {
int a = 100;
int negateA = (a | 0x80000000);
System.out.println("Negative A: " + negateA);
System.out.println("Negative A in HEX: " + Integer.toHexString(negateA));
}
}
输出:
Negative A: -2147483548
Negative A in HEX: 80000064
从输出中,十六进制值对我来说很有意义,因为我设置了整数的最高有效位,而该值的其余部分指示其十进制值为 100,这就是我最初设置的值。
我不明白为什么当我只打印整数时我得到-2147483548
java 内部存储数字的方式和检索数字的方式有区别吗?
最佳答案
这不是从正数得到负数的方法! Java使用two's complement .
为了反转 int
的符号(无论它最初是正数还是负数),您可以:
~val + 1
对于long
、byte
和short
也是如此。
唯一不起作用的数字是 0x80000000,即 Integer.MIN_VALUE
,即 -2^31。但这是 n 位二进制补码表示的特征之一:它可以表示范围从 -2^(n-1) 到 2^(n-1) - 1 的数字。
以1为例:
0x00000001 // i = 1
0xFFFFFFFE // ~i
0xFFFFFFFF // ~i + 1 == -1
0xFFFFFFFF // i = -1
0x00000000 // ~i
0x00000001 // ~i + 1 == 1
关于Java打印整数与Integer.toHexString() : Different outputs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22596864/