我正在尝试这个简单的程序来捕获异常。捕获FreePascal中的整数溢出异常
除零异常成功捕获。但是,我似乎无法赶上整数溢出。
我明白,一个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
@Stuart感谢您的意见。我试着将17000乘以2并将其存储在'SmallInt'中。它的输出为* -31536 *。换句话说,它会溢出,但不会运行到异常处理代码中。 – itsols
你为什么不尝试我建议的代码。 17000 * 2可能会作为整数乘法执行,并且当您将结果存储在smallint中时,它将被截断为smallint。截断整数不是一种计算,因此它可能不会生成整数溢出异常。 – Stuart