2017-05-31 53 views
2

我在比较SmallInt变量与Ord函数的结果。 实施例:将SmallInt与Ord函数的结果进行比较的警告

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

这样做后,示出了以下警告消息(W1023):

W1023比较符号和无符号类型 - 加宽两个操作数上的

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

enter image description here

进一步信息:

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

回答

5

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

文档说,约Ord(X)

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

在Delphi XE7,'C'WideChar,和Ord('C')返回值将是一个16位的无符号类型Word)。 Smallint签署的类型。这就是为什么您会收到警告,因为您正在比较相同大小的有符号和无符号类型,所以必须将这些值扩大为下一个较大类型(Integer

2007年德尔福,'C'不是WideChar,它是一个AnsiChar,所以Ord('C')结果是Byte。由于Smallint可以包含Byte的所有值,所以两者都可以升级到Smallint,因此无需扩展到下一个更大的类型。


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

2

Ord()是一个产生无符号类型的内部函数。因此警告。在你的情况下,你通过它WideChar,所以匹配的整数类型是Word