Delphi - 检测 Int64 溢出错误

标签 delphi delphi-7

在 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+} 状态、某些整数算术运算。 .. 检查是否溢出.

问题:所以我的问题是,我们如何检测 Int64 的溢出错误?

(我使用的是 Delphi 7。在较新版本的 Delphi 中是否也会发生同样的情况?)

最佳答案

这是一个已知问题。请参阅http://qc.embarcadero.com/wc/qcmain.aspx?d=10185 ,以及安迪在底部写的评论。

我的建议是创建一个函数(我没有编译也没有测试它 - 只是一个例子):

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;

关于Delphi - 检测 Int64 溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11344263/

相关文章:

delphi - 表中的部分搜索(BDE)

Delphi 甲骨文 Blob

delphi - `at ReturnAddress`在Delphi中是什么意思?

arrays - 德尔福。多维数组作为参数

delphi - KaZip for C++Builder2009/Delphi

c++ - 使用消息处理程序将 c++ dll 调用转换为 delphi

delphi - Color Listbox.Item[N],其中 N 由代码生成

delphi - Indy10文件传输导致CPU使用率100%

mysql - 如何知道 ADOQuery.Post 是否会更改数据库?

Delphi - 拖放 + MouseDown + MouseUp