Java打印Integer Vs Integer.toHexString():不同的输出

时间:2014-03-23 20:48:01

标签: java hex byte bit-manipulation bits

在确定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内部存储数字与检索数字之间有区别吗?

2 个答案:

答案 0 :(得分:2)

这不是您从正数获得负数的方式! Java使用two's complement

为了反转int的符号(无论是初始正数还是负数),您可以:

~val + 1

longbyteshort 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   负;否则,它等于参数