2011-05-23 78 views

回答

8

其餘部分將已經存儲在x + y的總和中,假設您使用的是無符號整數。無符號整數溢出導致迴繞(有符號整數溢出未定義)。在評論中看到Pascal的標準參考。

溢出只能是1位。如果添加2個64位數字,則不能有多於1個進位位,因此您只需檢測溢出條件。

對於如何檢測溢出,有關該主題的前一個問題:best way to detect integer overflow

+1

同意,測試溢出條件的最簡單方法是在出現溢出時,加法結果恰好<參數中的一個參數。 – 2011-05-23 02:03:06

+0

完美,快速!謝謝。 – 2011-05-23 02:03:26

+0

哦,我怎樣才能得到數字,因爲它應該是「溢出後溢出整數(這是未定義的C和C + +)? – 2011-05-23 02:05:36

3

對於z = x + y,z存儲餘數。溢出只能是1位,並且很容易檢測到。如果你正在處理有符號整數,那麼如果xy具有相同的符號,但是z則相反。如果xy有不同的標誌,則不能溢出。對於無符號整數,您只需以相同的方式檢查最重要的位。

+0

C和C++中未定義整數溢出。如果x + y溢出,則z有一個未定義的值 - 而不是餘數。 – 2011-05-23 02:06:13

+0

Nvm我似乎撒謊了。謝謝! – 2011-05-23 02:13:22

+0

有符號整數溢出*爲*未定義,這意味着您必須提前檢測並避免溢出計算,就像您用零除除一樣。使用未簽名的,你可以安全地檢測到它。 – caf 2011-05-23 05:32:17

0

C和C++中的方法可能有很大的不同,因爲在C++中,可以爲您運算符重載工作,並將您希望保護的整數封裝在某種類中(您將爲其重載必要的運算符。在C語言中,你必須將你想保護的整數包含在一個結構體中(爲了傳遞餘數和結果)並調用一些函數來完成繁重的工作。

除此之外,兩種語言是相同的:取決於你想要執行的操作(在你的例子中添加),你必須找出可能發生的最壞情況並處理它

在添加的情況下,它是q簡單來說:如果兩者的總和大於某個最大值(如果最大值與其中一個操作數的差值大於另一個操作數的差值,則可以這樣計算),則可以計算餘數 - 太大的部分:if ((M - O1) > O2) R = O2 - (M - O1)(例如,如果M是100,則O1是80並且O2是30,30 - (100 - 80) = 10,其餘部分)。

減法的情況同樣簡單:如果您的第一個操作數小於第二個,則餘數是第二個減去第一個(if (O1 < O2) { Rem = O2 - O1; Result = 0; } else { Rem = 0; Result = O1 - O2; })。

它的乘法難度更大一些:最安全的方法是對值進行二進制乘法運算,並檢查結果值是否超過您所擁有的位數。二進制乘法是一個長期的乘法,就像如果你是做在紙上手小數乘法,你會做的,所以,例如,12 * 5:

0110 
    0100 
    ==== 
    0110 
     0 
    0110 
    0 
    ++++++ 
    011110 = 40 

,如果你有一個四位整數,你會在這裏溢出一位(即位4是1,位5是0)。所以只有第4位算作溢出)。

對於分區你只需要關心除以0,大部分時間 - 其餘的將被處理爲你的CPU。

HTH

RLC

+0

順便說一句:我假設你想檢測溢出並診斷它。 – rlc 2011-05-23 02:18:22

相關問題