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
相关产品推荐
相关产品推荐

