Java负int到hex和后退失败

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将整数的字符串表示forms返回为无符号值 – 而Integer.parseInt采用带符号的int。 如果您使用Integer.toString(value, 16)那么您将得到您想要的。

这总是令我烦恼的事情。 如果使用hex文字初始化int,则可以使用最大为0xFFFFFF的全范围正值; 任何大于0x7FFFFF东西都是负值。 这对于位掩码和其他操作非常方便,在这些操作中,您只关心位的位置 ,而不是它们的含义。

但是如果使用Integer.parseInt()将字符串转换为整数,则大于"0x7FFFFFFF"任何内容都将被视为错误。 可能有一个很好的理由为什么他们这样做,但它仍然令人沮丧。

最简单的解决方法是使用Long.parseLong()代替,然后将结果转换为int。

 int n = (int)Long.parseLong(s, 16); 

当然,只有在确定数字将在Integer.MIN_VALUE..Integer.MAX_VALUE范围内时才应该这样做。

根据文档, toHexString返回“整数参数的字符串表示forms,作为基数为16的无符号整数”。

因此正确的反向操作可能是作为Java 8的一部分引入的Integer.parseUnsignedInt

 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)时会给你一个正数(不是负数ParseInt(min,16)

一串位实际上没有足够的信息来确定此上下文中的符号,因此您需要提供它。 (考虑使用min = "F" 。那是+/- F吗?如果你将它转换为位并看到1111, 并且你知道它是一个字节,你可能会认为它是负数,但这是很多IFS。

这似乎对我有用:

 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”来找回符号。