【发布时间】: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、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}
对于谷歌爬虫,替代问题措辞:如何在 Delphi 中暂时禁用溢出检查?
【问题讨论】:
标签: delphi delphi-5 integer-overflow