2014-07-10 63 views
1

我應該寫一個程序,可以將十進制數轉換爲二進制。我有用於轉換工作的代碼,但是當用戶使用if/else語句輸入超過最大/最小值的數字(unsigned short)時嘗試發送錯誤。當輸入一個無效數字時,程序跳轉到轉換語句並輸出最大二進制數(如果輸入超過655355)或者從最大值(如果輸入負數)向後倒計數。上溢/下溢問題?

我以爲寫了一切正確。

#include <iostream> 
#include <cmath> 
#include <climits> 
using namespace std; 

// This converts the number to binary, it divides the imputed number by two, printing the reminders// 

void bin(unsigned short nub) 
{ 
    if (nub <=1) 
    { 
     cout << nub; 
     return; 
    } 

    unsigned short rem; 
    rem = nub % 2; 
    bin(nub/2); 
    cout << rem; 
} 

int main() 
{ 
    unsigned short dd; 
    unsigned short bigNumber = pow(2,sizeof(unsigned short)*8)-1; 

    cout << "\nPlease enter an unsigned short int between 0 and " << bigNumber << ": "; 
    cin >> dd; 


    //Should be printed if user imputs a number larger than the data type// 

    if (dd > bigNumber) 
    { 
     cout << "\nThe number is invalid. Please try again.\n\n"; 
    } 

    //Should be printed if user imputs a negative number// 

    else if (dd < 0) 
    { 
    cout << "\nThe number is invalid. Please try again.\n\n"; 
    } 

    //Prints the binary number// 

    else 
    { 
     cout << "\nThe Binary version of " << dd << " is "; 
     bin(dd); 
     cout << endl << endl; 
    } 


    return 0; 
} 
+1

由於'dd'和'bigNumber'是同一類型,'bigNumber'被設置爲該類型的最大可能值,所以'dd'不能更大,可以嗎? –

+1

看看['bitset :: to_string()'](http://en.cppreference.com/w/cpp/utility/bitset/to_string)。 – user657267

+0

爲什麼不只是使用bitset(http://www.cplusplus.com/reference/bitset/bitset/) –

回答

1

你自己正在發生溢流。使用dd的另一個數據類型,該數據類型能夠保存大於65535的值(例如unsigned int)。

+0

如果輸入值足夠大,也可能導致'無聲'溢出 – damgad

+0

當然,這僅僅是一個例子,只是提示如何克服使用數據類型的基本問題,第一次比較永遠不會失敗。 –

0

您遇到溢出問題,尤其是無符號數。

這是你的第一個問題:

unsigned short dd; 
    // ... 
    else if (dd < 0) 

您已經宣稱dd是無符號的,所以它是一個毫無意義的比較。

接下來,你做了

if(dd > bigNumber) 

其中bigNumberunsigned short可以容納的最大值。再次,這是一個毫無意義的比較。要修復它,你需要使dd成爲一個更大的數據類型;爲什麼不使用unsigned int

最後,一個樣式提示。而不是可怕的pow(2,sizeof(unsigned short)*8)-1裝置,使用USHRT_MAX,可在<climits>

0

問題是,您正在比較已經溢出dd。它永遠不會超過它可以容納的最大值。

正如其他人建議您可以使用更大的數據類型爲dd,但在某些情況下,也可能會發生「無聲」溢出。

想象一下,輸入的值足夠大,甚至可以溢出unsigned int(或任何其他)。你將會遇到同樣的問題。不太經常,但你會有。

有沒有簡單的方法來防止,你可以檢查回答this question你怎麼能做到這一點。

0

如果輸入對於數據類型來說太大,則流將處於失敗狀態。所以你可以檢查故障狀態。你現有的代碼沒有這樣做;在這種情況下,它會做什麼bin對於未初始化變量dd中的垃圾。

下面是一些示例代碼,實際使用循環(代碼說:「請重試」,然後退出!):

for (;;) 
{ 
    cout << "Please enter a number between 0 and " << USHRT_MAX << ": "; 
    cin >> dd; 

    if (!cin) 
    { 
     if (cin.eof()) 
      break;     // exit loop entirely if the input is closed 

     cout << "Not a valid unsigned short, please try again\n"; 
     cin.clear();     // cancel the failure state 
     string s; getline(cin, s);  // discard rest of line 
     continue; 
    } 

    cout << "The Binary version of " << dd << " is "; 
    bin(dd); 
    cout << endl; 
    break; 
} 

如果你想使用更有限的範圍比0 ...例如,您可以將if (!cin)更改爲if (!cin || dd < 12345)