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

Delphi:如何使用$OVERFLOWCHECKS OFF禁用溢出检查?,delphi,delphi-5,integer-overflow,Delphi,Delphi 5,Integer Overflow,我有一些代码会导致下溢: var t1, t2, delta: DWORD: begin t1 := 0xffffff00; t2 := 0x00000037; delta := (t2 - t1); 减法本身确实会产生溢出(下溢),但我不希望Delphi抛出eInToOverflow异常。因此,我尝试通过禁用溢出检查来禁用溢出检查代码的生成: var t1, t2, delta: DWORD: begin t1 := 0xffffff00; t

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

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

   delta := (t2 - t1);
减法本身确实会产生溢出(下溢),但我不希望Delphi抛出
eInToOverflow
异常。因此,我尝试通过禁用溢出检查来禁用溢出检查代码的生成:

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}

对于google crawler,另一个问题是:如何在Delphi中临时禁用溢出检查?

它在行级别不起作用。您需要在整个函数中关闭它。

我非常有兴趣查看有关此编译器选项和其他编译器选项的文档,特别是
$RANGECHECKS
。。。但是+1“这个答案很有用)范围检查在行级别上起作用。溢出检查仅在功能级别起作用。编译器到达
结尾时生效的任何设置都将用于生成整个函数的机器代码。它不是这样记录的,但它永远都是这样工作的。优化也仅在功能级别起作用;这是有文档记录的。我是从一些在行级别使用{$Q+/-}的Delphi代码中得到的。通过切换到上面回复中提到的{$OVERFLOWCHECKS ON/OFF},但是使用它们来包围整个函数,正如这个回复所指出的,我能够关闭溢出检查。但是,我必须删除已经存在的行级{$Q+/-}编译器指令,否则仍然会出现溢出异常。根据文档“”,选项为“{$OverFlowChecks Off}”,应该在函数或过程开始时只指定一次。我试过了,它对我有效。