15

検討:

{$R+}
i:= 1;
While i > 0 do
  i:= i + 1;
ShowMessage(IntToStr(i));

iByte、Word、Shortint、または TinyInt として宣言すると、予想どおり、範囲チェック エラーが発生します。iLongWord、Cardinal、Integer、LongInt、または Int64 として宣言すると、while ループを通過するだけで、上限を超えたときに取得される負または 0 の値が表示さiれます。

Delphi 7 は、32 ビットおよび 64 ビットの数値の範囲チェックをサポートしていませんか?

4

1 に答える 1

14

操作 i + 1 は、実際には範囲チェック エラーを生成しません。割り当て操作は行います。

Delphi は定数 '1' を Integer として評価するため、右側は Int64 または Integer (i の型と Integer の大きい方) のいずれかの結果を生成します。

行を展開すると、次のようになります

temp := i + 1 
i := temp

temp は 32 ビットまたは 64 ビットのいずれかになり、上限に達するとオーバーフローします。割り当てを行うまでに、完全に有効な 32 ビットまたは 64 ビットの値が得られるため、i が 32 ビット以上の場合に範囲チェックが失敗する可能性はありません。

i が 32 ビット未満の場合、temp が大きすぎて収まらない場合に範囲チェックが発生します。

i >= 32 ビットの場合、次のようにオーバーフロー エラーをキャッチできます。

{$R+,Q+}
...
于 2012-04-18T09:38:30.297 に答える