6

アンダーフローを引き起こすコードが少しあります:

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

   delta := (t2 - t1);

減算自体オーバーフロー(アンダーフロー)を生成しますが、DelphiでEIntOverflow例外をスローしたくありません。だから私はオーバーフローチェックを無効にすることによってオーバーフローチェックコードの生成を無効にしてみます:

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

{$OVERFLOWCHECKS OFF}
   delta := (t2 - t1);
{$OVERFLOWCHECKS ON}

ただし、OVERFLOWCHECKS OFFオプションを使用しても、例外がスローされます。そして、生成されたコードにはまだチェックが含まれています:

代替テキスト

上のドキュメントのリマインダー$Q

オーバーフローチェック

タイプスイッチ
構文{$Q+}または{$Q-}
{$OVERFLOWCHECKSON}または{$OVERFLOWCHECKSOFF}
デフォルト{$Q-}
{$OVERFLOWCHECKSOFF}
スコープローカル

備考

$ Qディレクティブは、オーバーフローチェックコードの生成を制御します。{$ Q +}状態では、特定の整数算術演算(+、-、*、Abs、Sqr、Succ、Pred、Inc、およびDec)のオーバーフローがチェックされます。これらの整数算術演算のそれぞれのコードの後に​​、結果がサポートされている範囲内にあることを確認する追加のコードが続きます。オーバーフローチェックが失敗すると、EIntOverflow例外が発生します(または、例外処理が有効になっていない場合はプログラムが終了します)。

$ Qスイッチは通常、範囲チェックコードの生成を有効または無効にする$Rスイッチと組み合わせて使用​​されます。オーバーフローチェックを有効にすると、プログラムの速度が低下し、プログラムがいくらか大きくなるため、デバッグにのみ{$Q+}を使用してください。

$OVERFLOWCHECKS OFFオーバーフローチェックコードの生成を無効にするにはどうすればよいですか?


メイソンの答えはうまくいった。改訂されたコードは次のとおりです。

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

   delta := Subtract(t2, t1);


{$OVERFLOWCHECKS OFF}
function Subtract(const B, A: DWORD): DWORD; //subtract B-A
begin
   {
      Disabling overflow checking does not work at the line level,
      only the routine level. 
      Hence the function to subtract two numbers.
   }
   Result := (B-A);
end;
{$OVERFLOWCHECKS ON}

グーグルクローラーの場合、別の質問の言い回し:Delphiでオーバーフローチェックを一時的に無効にする方法は?

4

1 に答える 1

13

ラインレベルでは機能しません。機能全体でオフにする必要があります。

于 2010-03-10T15:57:50.017 に答える