我正在比较一个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 下,相同的代码不会给我任何警告。
正如大卫所说,Ord()
是一个所谓的“编译器魔术”(或者,正如他们现在所说的,“内在”或“伪”)函数,即不是被调用的真正函数,而只是使用函数语法的东西,但被编译器作为一个特殊的构造并直接转化为代码。对于例如,也是如此。Chr()
, Writeln()
等等。它们通常可以具有不同和/或多种类型的参数或返回值,有时甚至具有附加的语法元素。
该文档说,关于Ord(X)
:
结果是 X 的序数位置;它的类型是可以容纳 X 类型的所有值的最小标准整数类型。
在德尔福XE7中,'C'
is a WideChar
,以及返回值Ord('C')
将是 16 位unsigned type (Word
). Smallint
is signed类型。这就是为什么你会收到警告,因为您正在比较相同大小的有符号类型和无符号类型,所以这些值必须扩大到下一个更大的类型(Integer
).
在德尔福2007年,'C'
不是一个WideChar
, 它是一个AnsiChar
,所以结果是Ord('C')
is a Byte
。无需扩展到下一个更大的类型,因为Smallint
可以包含所有值Byte
,所以两者都可以提升为Smallint
.
我同意编辑器中的信息提示是具有欺骗性的。Ord()
并不总是返回Smallint
,它返回保存参数的所有值所需的最小类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)