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

Java中如何将十六进制字符串转换为有符号整数?

解决十六进制字符串"7FF"转有符号int为-1的问题

这个问题我之前帮同学排查过,先给你理清楚核心问题,再给对应的解决办法:

首先,你用Integer.parseInt("7FF", 16)得到2047是完全正常的——这个方法默认把十六进制字符串当成无符号整数解析,"7FF"的十进制就是2047。而强制转short没用,是因为short是16位有符号类型,2047远小于short的最大值32767,转完还是正数,不会触发符号扩展变成负数。

接下来分两种情况看你的需求:

情况1:你可能写错了十六进制字符串(目标是12位补码的-1)

如果你的预期结果-1是12位有符号补码的话,那对应的十六进制应该是FFF(12位全1),而不是7FF。这种情况下,你需要把解析后的无符号值做符号扩展,把12位的符号位扩展到32位int:

String hex = "FFF";
int unsignedValue = Integer.parseInt(hex, 16);
// 左移20位把12位的符号位移到32位int的最高位,再算术右移补符号位
int signedValue = (unsignedValue << 20) >> 20;
System.out.println(signedValue); // 输出-1

情况2:你确实需要把"7FF"转换成-1(偏移二进制编码场景)

如果"7FF"就是正确的输入,那大概率是你在处理**偏移二进制(Offset Binary)**的编码——这种编码里,无符号值减去偏移量(这里是12位的偏移量2^11=2048)就得到有符号值:

String hex = "7FF";
int unsignedValue = Integer.parseInt(hex, 16);
int offset = 1 << 11; // 计算12位的偏移量2048
int signedValue = unsignedValue - offset;
System.out.println(signedValue); // 输出-1

通用工具方法(处理任意n位补码转换)

如果以后还要处理不同位数的有符号十六进制补码,可以用这个通用方法:

public static int parseSignedHex(String hexStr, int bitLength) {
    int unsigned = Integer.parseInt(hexStr, 16);
    // 只保留低bitLength位
    int mask = (1 << bitLength) - 1;
    unsigned &= mask;
    // 检查符号位是否为1
    if ((unsigned & (1 << (bitLength - 1))) != 0) {
        // 符号扩展,把高位都设为1
        unsigned |= ~mask;
    }
    return unsigned;
}

比如调用parseSignedHex("FFF", 12)会返回-1,调用parseSignedHex("7FF", 12)返回2047,完全符合补码规则。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:36:32