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。
答案 0 :(得分:0)
此字符序列必须表示一个正值或一个 会引发NumberFormatException。
您有overflow的整数,负数将提交给解码方法。因为Integer.MAX_VALUE == 2147483647
和0xcafebabe == 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 == 14
和result == -212855723
。它们相乘的结果将int溢出。为了防止这种情况,在我们的情况multmin == limit / radix
中,我们在乘法radix == 16
之前有最小值。