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

时间:2017-05-31 14:54:36

标签: delphi compiler-warnings delphi-xe7

我正在将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函数,但我找不到它。

enter image description here

更多信息:

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

2 个答案:

答案 0 :(得分:5)

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

文档说明了Ord(X)

  

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

在Delphi XE7中,'C'WideCharOrd('C')的返回值为16位无符号类型(Word )。 Smallint签名类型。这就是您收到警告的原因,因为您正在比较相同大小的有符号和无符号类型,因此必须将这些值扩展为下一个更大的类型(Integer。 / p>

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

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

答案 1 :(得分:2)

Ord()是一个产生无符号类型的内部函数。因此警告。在您的情况下,您传递的是WideChar,因此匹配的整数类型为Word