3

Delphi では、オーバーフロー エラーをどのように検出できInt64ますか?

整数の場合、次のことができます。

type
MyInt = Integer; //Int64

function TryMaxTimes10(out Res: MyInt): boolean;
var
  a, b: MyInt;
begin
  {$Q+}
  try
    a := High(MyInt);
    b := 10;
    Res := a * b; //REF1
    Result := True; 
  except
    Result := False;
  end;
  {$Q-}
end;

の場合MyInt = Integer、行 REF1 で例外が発生するため、TryMaxTimes10戻りますfalse

しかし、MyInt を に変更するMyInt = Int64と、REF1 は例外を発生させずに!をTryMaxTimes10返します。true

{$Q+}のヘルプには具体的に言及されていないことを理解していますInt64: ... {$Q+} state, certain integer arithmetic operations ... are checked for overflow.

質問: 私の質問は、Int64 のオーバーフロー エラーを検出するにはどうすればよいですか?

(私は Delphi 7 を使用しています。新しいバージョンの Delphi でも同じことが起こりますか?)

4

2 に答える 2

3

これは既知の問題です。http://qc.embarcadero.com/wc/qcmain.aspx?d=10185と、Andy が最後に書いたコメント を参照してください。

私の提案は、関数を作成することです(これをコンパイルもテストもしていません-単なる例です):

function Foo(A, B : Int64) : Int64;
var bNeg : boolean;
begin
  // Do we expect a negative result?
  bNeg := ((a < 0) xor (b < 0));
  // Get the real result
  Result := a * b;
  // If the result is wrong, raise an error
  if ((Result < 0) xor bNeg) then begin
    // Raise EOverFlow
  end;
end;
于 2012-07-05T12:40:10.177 に答える