W1024 组合有符号和无符号类型 - 扩展了两个操作数

Fab*_*ale 2 delphi

我怎样才能防止这个警告?[DCC 警告] uFvSystem.pas(293): W1024 组合有符号和无符号类型 - 加宽了两个操作数

function LinkerTimestamp: TDateTime; overload;
begin
  Result := PImageNtHeaders(HInstance + PImageDosHeader(HInstance)^._lfanew)
   ^.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

该错误消息表明您正在使用混合有符号和无符号操作数执行整数算术。唯一的整数算法在这里:

HInstance + PImageDosHeader(HInstance)^._lfanew
Run Code Online (Sandbox Code Playgroud)

第一个操作数是无符号的,第二个是有符号的,即使它必须是正数。

您可以使用强制转换来抑制警告。最好在无符号上下文中执行算术,从而避免范围检查错误。因此,强制转换被放置在第二个操作数周围:

HInstance + NativeUInt(PImageDosHeader(HInstance)^._lfanew)
Run Code Online (Sandbox Code Playgroud)

或者

HInstance + Cardinal(PImageDosHeader(HInstance)^._lfanew)
Run Code Online (Sandbox Code Playgroud)

如果您有一个没有NativeUInt.

但是,您实际上是在对指针执行算术运算,所以我会这样写:

PByte(HInstance) + PImageDosHeader(HInstance)^._lfanew
Run Code Online (Sandbox Code Playgroud)

或者

PAnsiChar(HInstance) + PImageDosHeader(HInstance)^._lfanew
Run Code Online (Sandbox Code Playgroud)

PByte不支持算术的旧版 Delphi 中。