Java负整数转换为十六进制,返回失败

Java负整数转换为十六进制,返回失败,java,parsing,decimal,hex,signed,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(

给予

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)
它不会爆炸,但当您运行
ParseInt(min,16)
时,它会给您一个正数(而不是负数)


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

有文件证明,
Integer.tohextstring
将整数的字符串表示形式作为无符号值返回,而
Integer.parseInt
则取有符号的int。如果你可以使用
Integer.toString(value,16)
来代替你想要的。

试试这个:

Integer min = Integer.MIN_VALUE + 1;
}

要获得此信息:

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));
    }

这总是让我恼火。如果你用十六进制文字初始化一个int,你可以使用最大为
0xFFFFFF
的整个正值范围;任何大于
0x7FFFFF
的值都将是负值。这对于位屏蔽和其他只关心b的位置的操作非常方便这不是他们的意思

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

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

-2147483648 80000000
-2147483648

当然,只有在确定数字在
Integer.MIN\u VALUE..Integer.MAX\u VALUE
范围内时,才应该这样做这似乎对我有效:

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

整数被解析为处理如此大的正数的“有符号长”,然后通过将其强制转换为“int”来找到该符号。

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

因此,正确的反向操作可能是作为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((int)Long.parseLong(minHex, 16));
}
}

如果有一种方法可以将十六进制转换为int/long,只需放置位而不考虑符号,那就太酷了,这样就可以以最小的开销来回转换。
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));
    }