【问题标题】:Delphi: How do i use $OVERFLOWCHECKS OFF to disable overflow checks?Delphi:如何使用 $OVERFLOWCHECKS OFF 禁用溢出检查?
【发布时间】:2010-03-10 15:49:21
【问题描述】:

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

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 中暂时禁用溢出检查?

【问题讨论】:

    标签: delphi delphi-5 integer-overflow


    【解决方案1】:

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

    【讨论】:

    • 我非常有兴趣查看有关此和其他编译器选项的文档 - 特别是 $RANGECHECKS... 但是 +1“这个答案很有用)
    • 范围检查是否在行级别上工作。溢出检查仅适用于函数级别。在编译器到达end 时,无论哪种设置有效,都将用于生成整个函数的机器代码。它没有以这种方式记录,但这就是它永远工作的方式。优化也只在功能层面起作用;这是记录在案的。
    • 我从一些在行级别使用 {$Q+/-} 的 Delphi 代码来到这里。通过切换到上面回复中提到的 {$OVERFLOWCHECKS ON/OFF} ,但正如回复所指出的那样,使用它们包围整个函数,我能够关闭溢出检查。但是,我必须删除已经存在的行级 {$Q+/-} 编译器指令,否则我仍然会遇到溢出异常。
    • 根据文档“delphibasics.co.uk/RTL.asp?Name=$OverFlowChecks”,该选项是“{$OverFlowChecks Off}”,并且只能在函数或过程开始时指定一次。我试过了,它对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多