2012-11-02 49 views
1

這是我的代碼:C++:得到一個奇怪的打印輸出

long base2(int number) 
{ 
    long result = 0; 
    int num = number; 
    int multi = 1; 
    int rem; 
    while(num > 0) 
    { 
    rem = num % 2; 
    result = result + (rem * multi); 
    num = num/2; 
    multi = multi * 10; 
    } 
    return result; 
} 

我得到一個奇怪的打印:-1884801888

我跑了調試器及其在年底最後的答案正確,但只是計算更改此-1884801888

[打印發生在主,我檢查,改變數這裏-1884801888]

謝謝!

+0

'multi = multi * 10;'最終是否超出'int'範圍呢? –

+0

即時通訊新來的c + +(來自java),我知道我必須照顧這裏的內存。但溢出在哪裏?沒有陣列或任何東西我必須照顧...我必須從內存中刪除嗎? – Fashizel

+0

代碼看起來正確。你如何稱呼這個功能,以及如何打印結果?也可能是它的整數溢出,如果你處理大數... – solarised

回答

2

在當今最常見的平臺上,intlong都是32位寬。您正在導致整數溢出,其中您計算的值超出了以帶符號的32位整數表示的範圍。

如果值不適合在32位但適合在63位或64位,則可以使用long longunsigned long long(或固定寬度類型int64_tuint64_t<stdint.h>)數據類型來存儲結果。如果這些數據不夠大,那麼您需要使用更復雜的解決方案(例如,GMP庫具有任意大小的整數支持),但只能作爲最後的手段。

+0

thanx !! int溢出! – Fashizel

1

它看起來像你想要一個數字,打印出它的二進制表示,首先將它轉換成一種十進制編碼二進制。沒有必要進行轉換,該數字已經在內部存儲爲一堆0和1。實際上,打印出來必須經過一些處理才能打印出十進制數字。

下面是如何打印出號在幾個不同的方式:

const int foo = 17; 
std::bitset<sizeof(foo)*8> b(foo); 

std::cout << "Decimal: " << foo 
      << "\nHex:  " << std::hex << foo 
      << "\nOctal: " << std::oct << foo 
      << "\nBinary: " << b << std::endl; 

二進制形式打印出所有的前導零,這樣一來,但也有其跳過前導零的其他方式。