我有一些导致下溢的代码:
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-}
{$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}
对于谷歌爬虫,替代问题措辞:如何在 Delphi 中暂时禁用溢出检查?