15

考虑:

{$R+}
i:= 1;
While i > 0 do
  i:= i + 1;
ShowMessage(IntToStr(i));

如果我声明i为 Byte、Word、Shorint 或 TinyInt,我会得到一个范围检查错误,正如预期的那样。如果我声明i为 LongWord、Cardinal、Integer、LongInt 或 Int64,它只会通过 while 循环并显示负值或 0 值,i当您通过上限时会显示该值。

Delphi 7 不支持 32 位和 64 位数字的范围检查吗?

4

1 回答 1

14

操作 i + 1 实际上不会产生范围检查错误。赋值操作确实如此。

Delphi 将常量 '1' 评估为整数,因此右侧将产生一个 Int64 或整数(i 的类型和整数中的较大者)的结果。

如果我们扩展这条线,我们会得到以下信息

temp := i + 1 
i := temp

temp 将是 32 位或 64 位,如果达到上限,则会溢出。当我们进行赋值时,我们有一个完全有效的 32 位或 64 位值,因此如果 i 为 32 位或更多,则范围检查不会失败。

如果 i 小于 32 位,它将引发范围检查,如果 temp 太大而无法容纳。

对于 i >= 32bits,您可以像这样捕获溢出错误:

{$R+,Q+}
...
于 2012-04-18T09:38:30.297 回答