2012-04-18 2 views
14

は考えてみましょう:整数型とそれ以上の型に対して "i:= i + 1"で範囲チェックエラーが発生しないのはなぜですか?

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

私はバイト、ワード、ShortintまたはTINYINTとしてiを宣言すると、予想通り、私は、範囲チェックエラーが発生します。 LongWord、Cardinal、Integer、LongIntまたはInt64としてiを宣言すると、whileループを通過し、負の値または0の値が表示されます。上限を渡すとiが得られます。

デルファイ7は、32ビットと64ビットの数値の範囲チェックをサポートしていませんか?

答えて

13

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

Delphiは定数 '1'を整数として評価し、右辺はInt64または整数(iの型と整数のうち大きい方)の結果を生成します。

我々が行を展開すると、我々は以下の

temp := i + 1 
i := temp 

一時は32ビットまたは64ビットのどちらかになりますし、それが上限に当たる場合はオーバーフローする取得します。割り当てを行うときには、32ビットまたは64ビットの値が完全に有効なので、32ビット以上であればレンジのチェックに失敗する可能性はありません。

iが32ビット未満の場合、tempが大きすぎてフィットできない場合は範囲​​チェックが発生します。

は私のために> = 32ビットでは、あなたはとても似オーバーフローエラーをキャッチすることができますいくつかの方向を手伝ってくれましたあなたの説明のための

{$R+,Q+} 
... 
+0

感謝を。私はいくつかのテストを行い、代わりにi + 1を追加しました.i + jに同じタイプのiとjの両方を追加しました。これは同じ問題を引き起こしました。ですから、私は "+"演算子が結果を整数にすると言います。 しかし、私がInc(i)を使用すると、私が使用するタイプにかかわらず、私はrangecheckエラーを取得しません。私は{$ Q +}が私に整数オーバーフローの例外を与えることを発見しました。 –

+0

申し訳ありませんが、それはQであってはいけませんでした。O: – JamesT

+2

最終的に私は仕事に間違ったツールを使用していましたので、rangecheckではなくオーバーフローを探していたはずです。 –

関連する問題