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)
怎么了?
最佳答案
这件事一直困扰着我。如果用十六进制文字初始化一个 int,则可以使用整个正值范围,最大为 0xFFFFFF
;任何大于 0x7FFFFF
的值都将是一个负值。这对于位屏蔽和其他您只关心位的位置而不是它们的含义的操作非常方便。
但是如果您使用 Integer.parseInt() 将字符串转换为整数,则任何大于 "0x7FFFFFFF"
的值都会被视为错误。他们这样做可能有充分的理由,但仍然令人沮丧。
最简单的解决方法是改用 Long.parseLong(),然后将结果转换为 int。
int n = (int)Long.parseLong(s, 16);
当然,只有当您确定数字将在 Integer.MIN_VALUE..Integer.MAX_VALUE
范围内时,您才应该这样做。
关于Java 负整数转十六进制并返回失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845230/