繁体   English   中英

"Java负整数到十六进制并返回失败"

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM