為何程式有時溢位有時不溢位? (原始碼下載)
如果您還是 VB 初學者的話,可能會在作數值加減乘除時遇到溢位的問題,可是又百思不得其解,明明很簡單的計算為何會溢位呢?讓我們看看以下這幾個運算式:
- 1 + 32767
- 1 + 32768
- 1& + 32767
- 1 + 32767&
- 1 + 32767 + 1&
您看出來以上哪幾個運算式會發生溢位的問題嗎?嗯...答案是 1 和 5 這兩個運算式會溢位。大家都知道整數的範圍是介於 -32768~32767,超過這個範圍就發生溢位;因為 VB 總是以最節省的記憶空間來為我們儲存那些沒明確宣告的數值,所以第 1 個運算式的 1 和 32767 都儲存在整數的範圍之內,但是 1+32767 超過整數範圍,因此發生溢位。而第 2 個運算式的 32768 超過整數範圍,VB 將其儲存在長整數範圍內,因此 1+32768 不會發生溢位。而第 3 和第 4 個運算式由於我們使用長整數的型態宣告字元 &,強迫 VB 在長整數的空間內計算此式,因此不會溢位。第 5 個運算式因為 1+32767 已經溢位了,即使我們在之後用 1& 強迫 VB 在長整數的空間內計算也來不及了。
同樣的道理可以用於乘法,您看出來以下哪幾個運算式會發生溢位的問題嗎?
- 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8
- 32768 * 2 * 3 * 4 * 5 * 6 * 7 * 8
- 1& * 2 * 3 * 4 * 5 * 6 * 7 * 8
- 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8&
- 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9&
ㄟ...答案也是 1 和 5 這兩個運算式會溢位。因為第 1 個運算式中的 1 * 2 * 3 * 4 * 5 * 6 * 7 =5040,所以很明顯的 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8=40320 會發生溢位;而第 2 個運算式由於 32768 會使得 VB 將其儲存在長整數的記憶空間內,因此只要整個運算式的值介於長整數範圍內就不會溢位,而第 3 和第 4 個運算式使用長整數的型態宣告字元 &,強迫 VB 在長整數的空間內計算此式,因此不會溢位。第 5 個運算式會溢位是因為在 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8=40320 已經超過整數的範圍,即使之後用 9&也為時已晚了。
從以上的說明可以了解到型態宣告字元的重要性了吧!以後再發生這種溢位的情形可不要怪說是 VB 的 bug喔!不過我對這種情形的解釋也不是很在行,如果有錯誤,希望您給我指正,讓我也能更進步喔!:)
06/06/1999 補充:
小瓜瓜來信指出:
1^1+32767 不會溢位,大家可以參考一下;根據我測試了一下,VB 對於指數運算是將其當成 Double 資料型態來運算,所以上式並不會有 error。
This page was written by Jaric on May. 8, 1999. All rights reserved.
Revised : Jun. 6, 1999