在 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/