考虑:
{$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位数字的范围检查吗?
答案 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+}
...