2017-05-31 8 views
2

SmallInt変数とOrd関数の結果を比較しています。 例:Ord関数の結果とSmallIntを比較する際の警告

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

これを行った後、次の警告メッセージが表示される(W1023):

W1023符号付きおよび符号なしのタイプの比較は - の両方のオペランドを

Delphiのヒントを広げOrd関数は、それがSmallIntを返してくれると言います。そのため、警告メッセージの原因を理解できません。 (私はOrdの機能をSystemユニットで探しましたが、見つかりませんでした)。

enter image description here

さらに情報:

  • 私は、Delphi XE7の下でテストしています。
  • Delphi 2007では、同じコードで警告が表示されません。

答えて

5

デビッドが言っているように、Ord()は、いわゆる "コンパイラマジック"(または、 "本質的"または "擬似"関数と呼ばれている)関数であり、呼び出される実際の関数ではなく、関数構文を使用しますが、コンパイラによって特別な構文として認識され、直接コードに変換されます。例えば、 Chr(),Writeln()などがあります。これらのパラメータは、通常、異なるタイプまたは複数のタイプのパラメータまたは戻り値を持ち、時には追加の構文要素を持つことさえあります。

ドキュメントを約Ord(X)、こう述べています。

結果はXの順序位置です。その型は、Xの型のすべての値を保持できる最小の標準整数型です。デルファイXE7で

'C'WideCharあり、Ord('C')の戻り値は16ビットの符号なしタイプ(Word)であろう。 Smallintであり、タイプが署名されています。そのため、同じサイズの符号付きタイプと符号なしタイプを比較しているため、次の大きなタイプ(Integer)に値を拡大する必要があるため、警告はです。

は、Delphi 2007では、'C'は、それがAnsiCharで、WideCharないので、Ord('C')の結果はByteです。 SmallintにはByteのすべての値を含めることができるので、次に大きいタイプに拡張する必要はありません。したがって、両方ともSmallintに昇格することができます。


私は、エディタの情報ヒントが欺瞞的であることに同意します。 Ord()は常にSmallintを返すとは限りません。引数のすべての値を保持するために必要な最小型を返します。

2

Ord()は、符号なしタイプを生成する組み込み関数です。したがって警告。あなたのケースでは、あなたはWideCharを渡しているので、一致する整数型はWordです。

関連する問題