我有一些导致下溢的代码:
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
选项,它仍会抛出异常。生成的代码仍然包含检查:
alt text http://i43.tinypic.com/intmrl.jpg
提醒您$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抓取工具,备用问题措辞:如何暂时禁用Delphi中的溢出检查?
答案 0 :(得分:13)
它在行级别不起作用。您需要为整个功能关闭它。