2016-01-07 17 views
2

我正在嘗試這個簡單的程序來捕獲異常。捕獲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中捕獲整數溢出的正確方法是什麼?

謝謝!

+0

我不是在Free Pascal中的專家,但我的猜測是,溢出異常時,纔會觸發作爲計算的結果。除以1不會更改該值,因此它不會生成異常。嘗試添加或減去或乘以範圍內的值,但操作結果超出範圍。例如x:= 32767; x:= x + 1 – Stuart

+0

@Stuart感謝您的意見。我試着將17000乘以2並將其存儲在'SmallInt'中。它的輸出爲* -31536 *。換句話說,它會溢出,但不會運行到異常處理代碼中。 – itsols

+0

你爲什麼不嘗試我建議的代碼。 17000 * 2可能會作爲整數乘法執行,並且當您將結果存儲在smallint中時,它將被截斷爲smallint。截斷整數不是一種計算,因此它可能不會生成整數溢出異常。 – Stuart

回答

0

您必須包括單位sysutils的,因爲它包含了更改最深的一種運行時錯誤的進入捕語言異常代碼

+0

感謝Marco。除了包括這個單元,我還需要做什麼?我已經包含了它,它沒有任何改變。 – itsols

+0

對於它的價值,我的編譯器版本在幫助>關於菜單中顯示了2.6.2-8 – itsols