Java负int到十六进制和后退失败

时间:2009-05-10 12:17:26

标签: java parsing decimal hex signed

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)

什么事?

6 个答案:

答案 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"来找回符号。