You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中十六进制字符串转带符号int值的问题求助

把十六进制字符串转为有符号int并存入数组的解决方案

核心问题本质

你遇到的是无符号32位十六进制值转Java有符号int的问题:Java的int是32位有符号类型,范围是-2^31到2^31-1,而0x80000000到0xffffffff的十六进制值对应无符号的2^31到2^32-1,直接用Integer.parseInt会报错,但我们需要把这些值映射到int的有符号补码范围。


最简单的解决方法(Java 8+)

用Integer.parseUnsignedInt方法,这是Java专门为这个场景提供的API,直接解析无符号十六进制字符串为对应的有符号int:

// 处理带0x前缀、下划线的十六进制字符串
String hex = "0x8000_0000";
// 先清理前缀和下划线
String cleanHex = hex.replaceAll("^0x|^0X|_", "");
int signedInt = Integer.parseUnsignedInt(cleanHex, 16);
System.out.println(signedInt); // 输出 -2147483648(正好是Integer.MIN_VALUE)

把这个逻辑封装成方法,循环处理所有十六进制字符串存入int数组就行:

public static int[] hexStringsToIntArray(String[] hexStrs) {
    int[] result = new int[hexStrs.length];
    for (int i = 0; i < hexStrs.length; i++) {
        String clean = hexStrs[i].replaceAll("^0x|^0X|_", "");
        result[i] = Integer.parseUnsignedInt(clean, 16);
    }
    return result;
}

兼容低版本Java的位运算方案

如果用Java 8以下版本,用Long.parseLong解析成无符号long,然后直接强转int即可——Java强转long到int时,会自动截取低32位,以补码形式解析为有符号int,这正好是我们需要的结果:

String hex = "0xffffffff";
String cleanHex = hex.replaceAll("^0x|^0X|_", "");
long unsignedLong = Long.parseLong(cleanHex, 16);
int signedInt = (int) unsignedLong;
System.out.println(signedInt); // 输出 -1

为什么你之前的代码会出问题?

你手动计算的(int) (Integer.MIN_VALUE + (b - Integer.MAX_VALUE - 1))其实和直接强转逻辑等价,但没必要这么写,而且如果没处理好字符串的前缀、下划线,或者某些边界值的计算逻辑冗余出错,就会导致测试用例失败。直接强转是最简洁可靠的方式。


测试验证

几个典型案例的结果:

  • "0xaf12" → -20206
  • "0x80000000" → -2147483648
  • "0xffffffff" → -1
  • "0x12345678" → 305419896

内容的提问来源于stack exchange,提问作者Timofey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:22:46