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

标签 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)

怎么了?

最佳答案

这件事一直困扰着我。如果用十六进制文字初始化一个 int,则可以使用整个正值范围,最大为 0xFFFFFF;任何大于 0x7FFFFF 的值都将是一个负值。这对于位屏蔽和其他您只关心位的位置而不是它们的含义的操作非常方便。

但是如果您使用 Integer.parseInt() 将字符串转换为整数,则任何大于 "0x7FFFFFFF" 的值都会被视为错误。他们这样做可能有充分的理由,但仍然令人沮丧。

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

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

当然,只有当您确定数字将在 Integer.MIN_VALUE..Integer.MAX_VALUE 范围内时,您才应该这样做。

关于Java 负整数转十六进制并返回失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845230/

相关文章:

parsing - 如何使用 nom 将带符号的字符串解析为 i32?

c# - 为什么 decimal.Parse(10 10) 有效?

vba - 另存为 .csv 正确的小数分隔符

java - 如何要求 Pane 重新布局

java - 如何在JSP页面中垂直打印出ArrayList对象?

java - 由于数组索引导致的字符串异常

php - number_format() php 删除尾随零

java - Spring 数据 : several implementations

java - 在 Controller 外部获取 JPA 事务 - Play Framework

c# - 在 C# 中验证带括号的 boolean 表达式