Delphi:如何使用$ OVERFLOWCHECKS OFF来禁用溢出检查?

Ian*_*oyd 6 delphi integer-overflow delphi-5

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

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

   delta := (t2 - t1);
Run Code Online (Sandbox Code Playgroud)

减法本身确实会产生溢出(下溢),但我不希望Delphi抛出EIntOverflow异常.所以我尝试通过禁用溢出检查来禁用溢出检查代码的生成:

var
    t1, t2, delta: DWORD:
begin
   t1 := 0xffffff00;
   t2 := 0x00000037;

{$OVERFLOWCHECKS OFF}
   delta := (t2 - t1);
{$OVERFLOWCHECKS ON}
Run Code Online (Sandbox Code Playgroud)

然而即使有了OVERFLOWCHECKS OFF选项,它仍然会引发异常.生成的代码仍然包含检查:

替代文字http://i43.tinypic.com/intmrl.jpg

提醒文档$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}
Run Code Online (Sandbox Code Playgroud)

对于Google抓取工具,备用问题措辞:如何暂时禁用Delphi中的溢出检查?

Mas*_*ler 13

它在行级别不起作用.您需要为整个功能关闭它.

  • 范围检查*确实*在行级别上工作.溢出检查仅适用于功能级别.在编译器到达`end`时生效的任何设置都将是用于生成整个函数的机器代码的设置.它没有记录,但这是它永远工作的方式.优化也仅适用于功能级别; 这是有记录的. (4认同)