Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi W1024组合有符号和无符号类型-加宽了两个操作数_Delphi - Fatal编程技术网

Delphi W1024组合有符号和无符号类型-加宽了两个操作数

Delphi W1024组合有符号和无符号类型-加宽了两个操作数,delphi,Delphi,我如何才能防止此警告? [DCC Warning]uFvSystem.pas(293):W1024组合有符号和无符号类型-加宽了两个操作数 function LinkerTimestamp: TDateTime; overload; begin Result := PImageNtHeaders(HInstance + PImageDosHeader(HInstance)^._lfanew) ^.FileHeader.TimeDateStamp / SecsPerDay + UnixD

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

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

\u lfanew
字段是一个
LongInt
HInstance
变量可能是一个
THandle
,它是
Cardinal
或某些等效类型的别名。有您的签名类型和未签名类型

金额应该是什么类型的?可能值的范围比
THandle
的大小宽一点。(m位数字和n位数字之和最多需要
max(m,n)
bit。)所涉及的两种类型都不够大,因此编译器将它们提升为更宽的类型,以适应整个范围

您知道一些编译器不知道的关于这些变量范围的信息。特别是,您知道,
\l新的
是一个内存范围内的偏移量,它以
HInstance
为基础。只要没有文件损坏,
HInstance
\u lfanew
的总和将是一个有效地址,因此您可以安全地将cast
\u lfanew
键入一个无符号类型,并确信总和不会溢出:

Result := PImageNtHeaders(HInstance + UIntPtr(PImageDosHeader(HInstance)^._lfanew))
  ^.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;

如果您的Delphi版本提供,请使用
uintpttr
。否则,
NativeUInt
Cardinal
就可以了。

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

HInstance + PImageDosHeader(HInstance)^._lfanew
第一个操作数是无符号的,第二个操作数是有符号的,即使它必须是正的

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

HInstance + NativeUInt(PImageDosHeader(HInstance)^._lfanew)

如果您有一个没有
NativeUInt
的旧Delphi

但是,您实际上是在指针上执行算术运算,因此我将这样编写:

PByte(HInstance) + PImageDosHeader(HInstance)^._lfanew


在较旧的Delphi版本中,
PByte
不支持算术

第二段并不能真正证明这个警告是正确的。即使这两种类型相同,加法也可能溢出。我认为这个警告实际上是因为编译器没有理由为表达式选择类型。表达式是a+b。a+b应该是a型还是b型?
PByte(HInstance) + PImageDosHeader(HInstance)^._lfanew
PAnsiChar(HInstance) + PImageDosHeader(HInstance)^._lfanew