在确定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
从输出中,HEX中的值对我有意义,因为我设置整数的最高有效位,其余值表示其十进制值为100,这是我最初设置的。
我无法理解为什么当我打印出-2147483548
java内部存储数字与检索数字之间有区别吗?
答案 0 :(得分:2)
这不是您从正数获得负数的方式! Java使用two's complement。
为了反转int
的符号(无论是初始正数还是负数),您可以:
~val + 1
long
,byte
和short
s相同。
它不起作用的唯一数字是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
答案 1 :(得分:0)
区别在于"它是如何存储的"和"当它被检索时#34;,但它归结为当你转换为十进制和二进制时如何解释内部表示。在第一种情况下,它被解释为二进制补码,产生负数。使用Integer.toHexString将其转换为十六进制时,它将被解释为无符号值。来自Integer.toHexString的javadoc:
如果参数是,则无符号整数值是参数加23 ^ 2 负;否则,它等于参数