我正在将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
函数,但我找不到它。
更多信息:
答案 0 :(得分:5)
正如David所说,Ord()
是一个所谓的“编译魔术”(或者,现在称之为“内在”或“伪”)函数,即不是一个被调用的真实函数,但是只是使用函数语法的东西,但被编译器识别为特殊构造并直接转换为代码。例如,对于例如Chr()
,Writeln()
等。它们通常可以包含不同和/或多种类型的参数或返回值,有时甚至还有其他语法元素。
文档说明了Ord(X)
:
结果是X的顺序位置;它的类型是最小的标准整数类型,可以保存X的所有值类型。
在Delphi XE7中,'C'
为WideChar
,Ord('C')
的返回值为16位无符号类型(Word
)。 Smallint
是签名类型。这就是您收到警告的原因,因为您正在比较相同大小的有符号和无符号类型,因此必须将这些值扩展为下一个更大的类型(Integer
)。 / p>
在Delphi 2007中,'C'
不是WideChar
,而是AnsiChar
,因此Ord('C')
的结果是Byte
。由于Smallint
可以包含Byte
的所有值,因此无需扩展到下一个更大的类型,因此两者都可以提升为Smallint
。
我同意编辑器中的信息提示具有欺骗性。 Ord()
并不总是返回Smallint
,它返回保存参数的所有值所需的最小类型。
答案 1 :(得分:2)
Ord()
是一个产生无符号类型的内部函数。因此警告。在您的情况下,您传递的是WideChar
,因此匹配的整数类型为Word
。