Delphi 64位下HexToInt函数失效问题求助(32位正常)
Delphi 64位环境下HexToInt函数问题的解决方案
问题根源
你的函数在32位正常但64位失效的核心原因:
- 32位Delphi中,
Smallint(16位有符号)运算会先提升至32位整数执行,赋值回Smallint时若关闭范围检查,会自动截断为16位补码值; - 64位下,
ord(MSC) shl 8得到的数值(如253<<8=64768)超出Smallint的最大值(32767),开启范围检查时直接触发错误;若改为Integer返回,得到的是无符号16位数值(如64807),而非期望的有符号补码结果。
规范高效的修复方案
先将两个字节组合为16位无符号整数(Word),再强制转换为Smallint,既避免范围错误,又能正确解析有符号补码:
function HexToInt(MSC, LSC: ANSIChar): Smallint; begin Result := Smallint((Word(Ord(MSC)) shl 8) or Word(Ord(LSC))); end;
若追求可读性,可拆分步骤:
function HexToInt(MSC, LSC: ANSIChar): Smallint; var CombinedValue: Word; begin // 组合两个字节为16位无符号整数 CombinedValue := (Word(Ord(MSC)) shl 8) or Word(Ord(LSC)); // 转换为16位有符号整数,自动处理补码逻辑 Result := Smallint(CombinedValue); end;
结果验证
传入chr(253) & chr(39)时:
Word(Ord(MSC))为253,左移8位后得到64768(十六进制$FD00);Word(Ord(LSC))为39(十六进制$27);- 按位或后得到
$FD27(十进制64807,无符号); - 转换为
Smallint时,$FD27作为16位有符号补码,对应值为-729,与32位环境下的正确结果完全一致。
内容的提问来源于stack exchange,提问作者David Wilbourn
相关产品推荐
相关产品推荐

