【问题标题】:Why doesn't "i := i + 1" give a range-check error for Integers and larger types?为什么“i := i + 1”不给整数和更大类型的范围检查错误?
【发布时间】:2012-04-18 08:53:37
【问题描述】:

考虑:

{$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 位数字进行范围检查吗?

【问题讨论】:

    标签: delphi range-checking


    【解决方案1】:

    操作 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+}
    ...
    

    【讨论】:

    • 感谢您的解释,这有助于一些方向。我做了一些更多的测试,而不是添加 i+1 我添加了 i+j ,其中 i 和 j 的类型相同。这导致了同样的问题。所以我会说“+”运算符使结果成为整数。不过奇怪的是:如果我使用 Inc(i),那么无论我使用什么类型,我都不会收到范围检查错误。我发现 {$Q+} 给了我一个整数溢出异常。
    • 抱歉,是的,应该是 Q,而不是 O :)
    • 所以最后我使用了错误的工具来完成这项工作,应该一直在寻找溢出而不是范围检查。
    猜你喜欢
    • 2012-08-25
    • 2020-06-21
    • 1970-01-01
    • 2018-04-08
    • 2023-03-17
    • 2015-08-17
    • 2022-07-13
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多