6

我有一些导致下溢的代码:

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、IncDec)是否溢出。每个整数算术运算的代码后面都有附加代码,用于验证结果是否在支持的范围内。如果溢出检查失败,则会引发 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 中暂时禁用溢出检查?

4

1 回答 1

13

它在线路级别不起作用。您需要为整个功能关闭它。

于 2010-03-10T15:57:50.017 回答