我正在将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 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/