2017-07-29 64 views
3

我有一個簡單的方法,基本上反轉有符號整數。該函數一直運行到整數小於或等於32位。 例如: -檢測32位整數溢出

input = 321 
output = 123 

input = -321 
output = -123 

input = 1534236469 
output = 9646324351 //this value is wrong. 

expected output = 0 

我要檢測的整數溢出,並在這種情況下返回0。 下面是該函數的代碼

int reverse(int x) { 
    int number = x; 
    bool negative = false; 
    if(number<0){ 
     negative = true; 
     number *= -1; 
    } 

    int reversed = 0; 
    while (number != 0){ 
     int reminder = number % 10; 
     reversed = (reversed * 10) + reminder; 
     number /= 10; 
    } 
    if(negative){ 
     reversed *= -1; 
    } 
    return reversed; 
} 

而且,如果我改變輸入和輸出到簽訂長我得到所需要的輸出,但我要檢測的整數溢出並返回0

+1

而當您使用調試器來逐步執行您的這一算法(每次一行)並檢查每個步驟中所有變量的值時,您做了哪些觀察?你的問題的答案是:學習如何使用調試器。瞭解如何使用調試器是每個C++開發人員必備的技能。 –

+0

@SamVarshavchik:不,答案並非如此。當溢出發生時,他希望**檢測**。他需要一個可以做到的算法。 – geza

+0

@SamVarshavchik,謝謝。我通過調試器進行了檢查。溢出發生在乘法中。將有助於瞭解是否有一種簡單的方法來檢測在算術運算情況下數字可能會經歷溢出。 –

回答

3

你乘以10 reversed之前,只是檢查,以確保它足夠小,乘以10

同樣,添加remainder之前,檢查,以確保它足夠小加remainder

有一個聰明的技巧,你可以使用的加法,而是在你的水平,你可能不應該:

if ((reversed += remainder) < remainder) { 
    //overflow 
} 

注意,如果兩個reversedremainder是無符號的伎倆才起作用。

+0

只有當'reversed'是一個無符號變量時,才能保證工作,您應該提及它。 – geza

+0

@geza真夠的。完成 –

+1

還是不行。它必須是未簽名的。無論溢出是正面還是負面,UB都是簽名溢出。 – geza

0

此提示可以幫助你完成你的任務:

你只會變得整數溢出如果您的最終號碼爲10位長,第一個數字最終可能超過或等於2

這意味着你是去如果您的原始號碼也是10位數字並且最後一位數字是2或以上,則會導致整數溢出。