将Java十六进制转换为十进制时出现错误

时间:2018-11-08 01:53:12

标签: java

System.out.println ("Hex fun:" + Long.toHexString (0x100000000L + 0xcafebabe));

我有上面的代码

在Java中,如果操作数数据类型不同,

不进行扩大转换。

long a = 10;
int b = 2;

a + b-> b转换为long类型。

那边

十六进制 0xcafebabe-> 32位int,因为左操作数的类型为logn,所以将其扩展并转换为正负号。 显示错误的操作值。 是的,这很好。

问题是,如果您使用十进制数字,

System.out.println (Integer.toHexString (-889275714)); // cafebabe
System.out.println (Long.toHexString (3405691582L)); // cafebabe -> extended

System.out.println (Integer.parseUnsignedInt ("cafebabe", 16)); // 3405691582 (QWORD)

Integer.decode(“ 0xcafebabe”)导致错误。

我有一个NumberFormat异常,我也不知道为什么。

System.out.println(Integer.parseUnsignedInt(“ cafebabe”,16)); ->这就是我的处理方式,因此我可以输出带符号的32位十进制整数。

据我所知,Java基元不会减少取决于操作系统的数据类型的长度。 该测试环境可在64位Windows上运行。

JDK是版本8。

1 个答案:

答案 0 :(得分:0)

来自documentation

  

此字符序列必须表示一个正值或一个   会引发NumberFormatException。

您有overflow的整数,负数将提交给解码方法。因为Integer.MAX_VALUE == 21474836470xcafebabe == 3405691582

针对您的情况的一种解决方案是使用Long.decode()

System.out.println ("Hex fun: " + Long.toHexString (0x100000000L + Long.decode ("0xcafebabe")));
// output: Hex fun: 1cafebabe 

更新
要了解到底发生了什么,您需要练习调试或阅读源代码:

public static Integer decode(String nm) throws NumberFormatException {
    // some code
    result = Integer.valueOf(nm.substring(index), radix);
    // in our case Integer.valueOf("cafebabe", 16)
    // some code
}

public static Integer valueOf(String s, int radix) throws NumberFormatException {
    return Integer.valueOf(parseInt(s,radix));
}

public static int parseInt(String s, int radix) throws NumberFormatException {
    // some code
    // limit == -Integer.MAX_VALUE == -2147483647
    // multmin == -134217727
    int multmin = limit / radix;
    int result = 0;
    while (i < len) {
        // Accumulating negatively avoids surprises near MAX_VALUE
        int digit = Character.digit(s.charAt(i++), radix);
        if (digit < 0 || result < multmin) {
            throw NumberFormatException.forInputString(s);
        }
        result *= radix;
        if (result < limit + digit) {
            throw NumberFormatException.forInputString(s);
        }
        result -= digit;
    }
    // some code
}

result < multmin防止整数溢出。在上一次迭代中,当i == 7时,我们将最后一位解码为digit == 14result == -212855723。它们相乘的结果将int溢出。为了防止这种情况,在我们的情况multmin == limit / radix中,我们在乘法radix == 16之前有最小值。