2017-05-31 55 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