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)
| 归档时间: |
|
| 查看次数: |
1202 次 |
| 最近记录: |