我正在嘗試這個簡單的程序來捕獲異常。捕獲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