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)
什么事?
答案 0 :(得分:12)
这总是令我生气。如果使用十六进制文字初始化int,则可以使用最大0xFFFFFF
的全范围正值;任何大于0x7FFFFF
的东西都会是负值。这对于位掩码和其他操作非常方便,在这些操作中,您只关心位的位置,而不是它们的含义。
但是如果使用Integer.parseInt()将字符串转换为整数,则将大于"0x7FFFFFFF"
的任何内容视为错误。可能有一个很好的理由让他们这样做,但它仍然令人沮丧。
最简单的解决方法是使用Long.parseLong()代替,然后将结果转换为int。
int n = (int)Long.parseLong(s, 16);
当然,如果您确定该数字将在Integer.MIN_VALUE..Integer.MAX_VALUE
范围内,您应该这样做。
答案 1 :(得分:11)
据记载,Integer.toHexString
将整数的字符串表示形式返回为无符号值 - 而Integer.parseInt
采用带符号的int。如果您使用Integer.toString(value, 16)
代替,您将得到您想要的内容。
答案 2 :(得分:6)
根据文档,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));
}
答案 3 :(得分:2)
试试这个:
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
答案 4 :(得分:1)
您需要include a negative签名。
我现在没有权限测试这个,但我敢打赌如果你试过这个值:
Integer min = Integer.MIN_VALUE + 1;
当你跑ParseInt(min,16)
时,它不会炸弹,但会给你一个正数(不是负数)。
位的字符串实际上没有足够的信息来确定此上下文中的符号,因此您需要提供它。 (考虑使用min = "F"
的情况。那是+/- F吗?如果你将它转换为位并看到1111,和你知道它是一个字节,你可能会得出结论它是否定,但那是很多ifs。
答案 5 :(得分:0)
这似乎对我有用:
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"来找回符号。