Java 负 int 到十六进制和返回失败
题
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseInt(minHex, 16));
}
}
给予
-2147483648 80000000
Exception in thread "main" java.lang.NumberFormatException: For input string: "80000000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:459)
at Main3.main(Main3.java:7)
这是怎么回事?
解决方案
它记载,Integer.toHexString
返回整数的字符串表示为无符号值 - 而Integer.parseInt
需要符号int。如果您使用Integer.toString(value, 16)
,而不是你会得到你想要的东西。
其他提示
这是什么,总是让我生气。如果你用十六进制初始化一个int文字,你可以使用全套正值可达0xFFFFFF
的;任何超过0x7FFFFF
较大真的会是一个负值。这是位屏蔽等操作非常方便,你只关心比特的地点的,不是他们的含义。
但是如果使用的Integer.parseInt()将字符串转换为整数,任何比"0x7FFFFFFF"
较大被当作错误。还有可能就是为什么他们做了这样一个很好的理由,但它仍然是令人沮丧的。
的最简单的解决方法是使用的Long.parseLong()来代替,然后把结果为int。
int n = (int)Long.parseLong(s, 16);
当然,你应该只这样做,如果你确定的数量将是范围Integer.MIN_VALUE..Integer.MAX_VALUE
。
根据文档, toHexString
回报 “整数参数的字符串表示形式 未签名 以 16 为基数的整数。”
所以正确的逆向操作可能是 Integer.parseUnsignedInt
作为 Java 8 的一部分引入:
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseUnsignedInt(minHex, 16));
}
尝试这种情况:
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseInt( "-" + minHex, 16));
}
}
要得到这样的:
-2147483648 80000000
-2147483648
你需要 包括负数 符号。
我现在无权测试这个,但我敢打赌,如果你尝试这个值:
Integer min = Integer.MIN_VALUE + 1;
它不会爆炸,但当你跑步时会给你一个正数(而不是负数) ParseInt(min,16)
.
A 细绳 位实际上没有足够的信息来确定此上下文中的符号,因此您需要提供它。(考虑您使用的情况 min = "F"
. 。是+/-F吗?如果你把它转换成位并看到 1111, 和 如果你知道它是一个字节,你可能会得出结论,它是负数,但这是很多如果。
这似乎为我工作:
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println((int)Long.parseLong(minHex, 16));
}
}
整数被解析为“符号长”用于处理这样的大的正数,然后将符号由铸造发现回它为“int”。