【发布时间】: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