【发布时间】:2012-07-24 09:40:55
【问题描述】:
如果我打开那些编译器检查指令,这里有一些代码会导致范围检查错误和溢出错误的精简版本。我理解为什么这会导致溢出,在 C1 的乘法中,它似乎可能超过数据类型的最大值。但是为什么这也会触发范围检查错误呢? Delphi 的文档和其他关于堆栈溢出的帖子听起来像是范围检查错误通常是针对超出范围的数组访问。但我没有访问它所说的导致范围检查错误的行上的数组。也许它分配给param1?但是,如果是这样,那为什么会是范围检查而不是溢出错误呢?
const
C1 = 44001;
C2 = 17999;
function fxnName(..other params...; param1: Word): String;
var
someByte: byte;
begin
// some code
// by now we're in a loop. the following line is where it breaks to in the debugger:
param1 := (someByte + param1) * C1 + C2;
// more code
end;
如果它是相关的,当它在调试器中的该行中断时,所有值看起来都符合预期,除了 param1,当我要求 Delphi 评估它时显示“未声明的标识符:'param1'”。
【问题讨论】:
-
我怀疑这只是因为范围检查发生在溢出检查之前,并且一旦引发范围检查异常,溢出检查就不会发生。 (不确定顺序,所以只是怀疑。)