[英]Java negative int to hex and back fails
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));
}
}
据记载, 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的无符号整数。”
因此正确的反向操作可能是作为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”来找回符号。
Integer.parseInt()
将有符号整数作为输入。 这意味着输入必须在“7FFFFFFF”和“-80000000”之间。 注意“80000000”之前的负号。 你想要的是Integer.parseInt("-80000000", 16)
。 如果使用不带减号的 80000000,Java 会将其解释为正数并抛出异常,因为 int 的最大正整数为 0x7FFFFFFF。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.