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返回整数的字符串表示为无符号值 - 而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 为基数的整数。”

所以正确的逆向操作可能是 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));
    }

尝试这种情况:

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).

A 细绳 位实际上没有足够的信息来确定此上下文中的符号,因此您需要提供它。(考虑您使用的情况 min = "F". 。是+/-F吗?如果你把它转换成位并看到 1111, 如果你知道它是一个字节,你可能会得出结论,它是负数,但这是很多如果。

这似乎为我工作:

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”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top