从十六进制解析Integer.MIN_VALUE会导致NumberFormatException

时间:2016-12-01 18:01:14

标签: java integer number-formatting numberformatexception

我尝试将Integer.MIN_VALUE从十六进制解析为int,但是我得到一个NumberFormatException。当我在String中添加一个减号时,它正在工作。

  1. 这是一个错误还是我误解了一些东西。从我的角度来看,编码和解码应该是双射的。但它似乎不是。

  2. 我必须解码“0x80000000”。我该怎么做?我可以捕获异常并在String中添加一个减号并重试。但这对我来说似乎并不干净。

  3. 这是一个正在运行的例子:

    public static void main(String[] args) {
        int i1 = Integer.MIN_VALUE; //0x80000000
        String s1 = Integer.toHexString(i1);
        String s2 = "-" + s1;
    
        System.out.println(String.format("Out1: %1$d | %1$h == %2$s <> %3$s", i1 , s1, s2));
        // Out1: -2147483648 | 80000000 == 80000000 <> -80000000
    
        // this should work, but does not
        try {
            int s1_parsed = Integer.parseInt(s1, 16);
            System.out.println(String.format("Out2: %1$d | %1$h, %2$d | %2$h", i1, s1_parsed));
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
        }
    
        // this is working, but I do not know why
        try {
            int s2_parsed = Integer.parseInt(s2, 16);
            System.out.println(String.format("Out3: %1$d | %1$h == %2$d | %2$h", i1, s2_parsed));
            // Out3: -2147483648 | 80000000 == -2147483648 | 80000000
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
        }
    }
    

1 个答案:

答案 0 :(得分:0)

toHexString方法返回数字的无符号字符串表示。

另见SO Java negative int to hex and back fails