【问题标题】:Catching an integer overflow exception in FreePascal在 FreePascal 中捕获整数溢出异常
【发布时间】:2016-01-07 18:01:51
【问题描述】:

我正在尝试这个简单的程序来捕获异常。

除以零异常被成功捕获。但是,我似乎无法捕捉到 整数溢出

我了解 SmallInt 类型的整数会在 +32767 之后溢出,因为最大有符号值 = 2^15 - 1(即 +32767)。

代码如下:

Program ss;

Var

  Price, Qty: SmallInt;
  Rate: Real;

Begin
  Try

    write('Enter Total price '); Readln(Price);
    Write('Enter qty '); Readln(Qty);

    Rate := Price / Qty;
    Writeln('Single item = ', Rate:0:2);

  except
    On EDivByZero Do Writeln('qty must be a valid num above 0');
    On EIntOverflow Do Writeln('too large')
  end;
End.

然而,溢出异常似乎没有被捕获。相反,溢出的值被视为负数,代码继续执行,就好像没有错误一样。

这是输出:

输入总价32768

输入数量 1

单项 = -32768.00

按任意键返回IDE

我在代码中做错了吗?在 FreePascal 中捕获整数溢出的正确方法是什么?

谢谢!

【问题讨论】:

  • 我不是 Free Pascal 方面的专家,但我的猜测是溢出异常仅作为计算结果触发。除以 1 不会更改值,因此不会产生异常。尝试对范围内的值进行加减或相乘,但运算结果超出范围。例如 x := 32767; x := x+1
  • @Stuart 感谢您的意见。我尝试将 17000 乘以 2 并将其存储在 SmallInt 中。它给出的输出为 -31536。所以换句话说,它溢出但没有运行到异常处理代码中。
  • 你为什么不试试我建议的代码。 17000 * 2 可能会作为整数乘法执行,当您将结果存储在 smallint 中时,它会被截断为 smallint 截断整数不是计算,因此可能不会产生整数溢出异常。
  • @Stuart 对于您的示例,输出为 -32768 (这是溢出值)并且没有触发异常。我记得一些较旧的语言(我认为是 VB6,但我现在无法确认)给出了类似的结果。再次感谢。

标签: exception-handling pascal freepascal integer-overflow


【解决方案1】:

您必须包含单元 sysutils,因为它包含将最深层次的运行时错误更改为可捕获语言异常的代码

【讨论】:

  • 谢谢马可。除了包括这个单元,我还有什么需要做的吗?我已将其包含在内,它无需任何更改即可工作。
  • 不管怎样,我的编译器版本在“帮助”>“关于”菜单上显示为 2.6.2-8
猜你喜欢
  • 2012-07-13
  • 2010-12-08
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多