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

为何Delphi 11编译x86触发W1022警告,x64却无此提示?

Delphi x86/x64编译警告差异问题解答

问题背景

使用Delphi 11(版本28.0.47991.2819)编译以下代码时,x86平台触发W1022 Comparison always evaluates to True警告,x64平台无警告:

procedure TForm1.FormCreate(Sender: TObject);
var
    a : NativeUInt;
begin
    a := 1;
    if ( 0 <= a ) then begin
        Caption := IntToStr( a );
    end;
end;

x64平台生成的汇编逻辑正常:

Unit1.pas.73: if ( 0 <= a ) then begin
0000000001142444 48837D3800       cmp qword ptr [rbp+$38],$00
0000000001142449 7227             jb TForm1.FormCreate + $52

原因分析

  1. 类型平台差异
    NativeUInt在x86下等价于32位无符号类型Cardinal,x64下等价于64位无符号类型UInt64。

  2. 静态检查规则的平台局限性

    • x86平台:编译器静态分析器能明确识别Cardinal为无符号类型,无符号数的取值范围是0到$FFFFFFFF,因此0 <= a的比较必然恒为真,触发警告。
    • x64平台:编译器的静态检查规则未对UInt64类型做同样的严格校验——逻辑上UInt64的取值范围是0到$FFFFFFFFFFFFFFFF,0 <= a同样恒为真,但编译器未检测到这个恒成立的条件,因此未发出警告。
  3. 汇编生成无异常
    两种平台的汇编代码都正确实现了无符号比较逻辑(x64用jb指令判断无符号小于),只是静态警告的检测覆盖范围在x64下存在遗漏,属于编译器的规则不一致问题,而非代码逻辑或编译输出错误。

内容的提问来源于stack exchange,提问作者P.Miz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:42:41