6


3

Delphi:$ OVERFLOWCHECKS OFFを使用してオーバーフローチェックを無効にするにはどうすればよいですか?

私はアンダーフローを引き起こすコードを少し持っています:

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

   delta := (t2 - t1);

減算自体は_does_オーバーフロー(アンダーフロー)を生成しますが、Delphiに「EIntOverflow」例外をスローさせたくありません。 そこで、オーバーフローチェックを無効にして、オーバーフローチェックコードの生成を無効にしてみます。

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

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

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

`$ Q`に関するドキュメントのリマインダー:

_ _ オーバーフローチェック

タイプ*スイッチ+ *構文 \ {$ Q +}または\ {$ Q-} + \ {$ OVERFLOWCHECKS ON}または\ {$ OVERFLOWCHECKS OFF} + デフォルト \ {$ Q-} + \ {$ OVERFLOWCHECKS OFF } + *スコープ*ローカル

備考

$ 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}

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

1 Answer


13


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