我正在将SmallInt变量与Ord函数的结果进行比较。
例:

var
  MySmallInt : SmallInt;
begin
  MySmallInt := 5;
  if(MySmallInt > Ord('C'))
  then ShowMessage('True')
  else ShowMessage('False');
end


执行此操作后,将显示以下警告消息(W1023):


W1023比较有符号和无符号类型-扩展了两个操作数


Delphi在Ord函数上的提示说它应该返回SmallInt,这就是为什么我不明白是什么原因导致了警告消息。 (我在Ord单元中寻找了System函数,但没有找到)。

delphi - 警告将SmallInt与Ord函数的结果进行比较-LMLPHP

更多信息:


我正在Delphi XE7下进行测试。
在Delphi 2007下,相同的代码不会给我任何警告。

最佳答案

正如David所说,Ord()是所谓的“编译器魔术”(或他​​们现在所说的“内在”或“伪-”)函数,即不是真正的函数,而是仅使用函数语法,但被编译器识别为特殊构造,并直接转换为代码。对于例如Chr()Writeln()等。它们通常可以具有不同和/或多种类型的参数或返回值,有时甚至还具有其他语法元素。

该文档说,关于Ord(X)


结果是X的序数位置;它的类型是可以容纳X类型的所有值的最小标准整数类型。


在Delphi XE7中,'C'WideChar,并且Ord('C')的返回值将是16位无符号类型(Word)。 Smallint是带符号类型。这就是为什么收到警告的原因,因为您正在比较相同大小的有符号和无符号类型,因此必须将值扩展为下一个更大的类型(Integer)。

在Delphi 2007中,'C'不是WideChar,而是AnsiChar,因此Ord('C')的结果是Byte。无需扩展到下一个更大的类型,因为Smallint可以包含Byte的所有值,因此都可以提升为Smallint



我同意编辑器中的信息提示具有欺骗性。 Ord()并不总是返回Smallint,它返回保存参数的所有值所需的最小类型。

关于delphi - 警告将SmallInt与Ord函数的结果进行比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44288051/

10-12 05:33