我有一些代码会导致下溢:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
delta := (t2 - t1);
减法本身does生成上溢(下溢),但我不希望 Delphi 抛出EIntOverflow
例外。因此,我尝试通过禁用溢出检查来禁用溢出检查代码的生成:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
{$OVERFLOWCHECKS OFF}
delta := (t2 - t1);
{$OVERFLOWCHECKS ON}
然而即使与OVERFLOWCHECKS OFF
选项,它仍然抛出异常。生成的代码仍然包含检查:
关于文档的提醒$Q
:
溢出检查
Type Switch
Syntax{$Q+} 或 {$Q-}
{$OVERFLOWCHECKS 开启} 或 {$OVERFLOWCHECKS 关闭}
Default {$Q-}
{$OVERFLOW检查关闭}
Scope Local
Remarks
$Q 指令控制
生成溢出检查代码。
在{$Q+}状态下,某个整数
算术运算(+、-、*、Abs、
Sqr、Succ、Pred、Inc, and 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}
对于谷歌爬虫,替代问题措辞:如何暂时禁用 Delphi 中的溢出检查?