关于将 SmallInt 与 Ord 函数的结果进行比较的警告

Warning on comparing a SmallInt with result of Ord function

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

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

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

W1023 Comparing signed and unsigned types - widened both operands

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

更多信息:

Ord() 是产生无符号类型的内部函数。因此警告。在你的例子中,你传递给它一个 WideChar,所以匹配的整数类型是 Word.

正如 David 所说,Ord() 是所谓的 "compiler magic"(或者,正如他们现在所说的那样,"intrinsic" 或 "pseudo-")函数,即不是真正的函数被调用的函数,但只是使用函数语法的东西,但被编译器识别为特殊结构并直接转换为代码。例如,同样如此。 Chr()Writeln()等。它们通常可以有不同的and/or多种类型的参数或return值,有时甚至有额外的语法元素。

文档说,关于 Ord(X):

The result is the ordinal position of X; its type is the smallest standard integer type that can hold all values of X's type.

在DelphiXE7中,'C'是一个WideCharOrd('C')的return值将是一个16位无符号 类型 (Word)。 Smallintsigned 类型。这就是您收到警告的原因,因为您正在比较相同大小的有符号和无符号类型,因此必须将值扩大到下一个更大的类型 (Integer).

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


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