为什么不“i:= i + 1”给出整数和更大类型的范围检查错误?

时间:2012-04-18 08:53:37

标签: delphi range-checking

考虑:

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

如果我将i声明为Byte,Word,Shortint或TinyInt,我会收到范围检查错误,如预期的那样。 如果我将i声明为LongWord,Cardinal,Integer,LongInt或Int64,它只会通过while循环并显示负值或0值,i在传递上限时得到。 / p>

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

1 个答案:

答案 0 :(得分:14)

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

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

如果我们扩展该行,我们将得到以下内容

temp := i + 1 
i := temp

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

如果i小于32位,则会在温度过大而不适合的情况下检查范围。

对于i> = 32位,您可以捕获溢出错误,如下所示:

{$R+,Q+}
...