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

Pie*_*r B 15 delphi range-checking

考虑:

{$R+}
i:= 1;
While i > 0 do
  i:= i + 1;
ShowMessage(IntToStr(i));
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*esT 14

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

Delphi将常量'1'作为整数进行求值,因此右侧将产生一个Int64或Integer的结果(i的类型和整数中的较大者).

如果我们扩展线,我们得到以下内容

temp := i + 1 
i := temp
Run Code Online (Sandbox Code Playgroud)

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

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

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

{$R+,Q+}
...
Run Code Online (Sandbox Code Playgroud)

  • 所以最后我使用了错误的工具来完成工作,应该一直在寻找溢出而不是范围检查. (2认同)