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

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)时:

  1. Word(Ord(MSC))为253,左移8位后得到64768(十六进制$FD00);
  2. Word(Ord(LSC))为39(十六进制$27);
  3. 按位或后得到$FD27(十进制64807,无符号);
  4. 转换为Smallint时,$FD27作为16位有符号补码,对应值为-729,与32位环境下的正确结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:07:45