2017-06-07 55 views
-1
int main() 
{ 
    unsigned n; 
    cin>>n; 
    for(int i=(1<<31);i>0;i/=2) 
     (i&n)?(cout<<1):(cout<<0); 
} 

我運行下面的代碼與n = 1但它沒有在控制檯上打印任何東西。將變量i的類型更改爲無符號的技巧並打印00000000000000000000000000000001.任何想法爲什麼?十進制數字到32位二進制

+1

什麼是有符號32位變量的數字0x80000000 ....? – LPs

+0

循環的最終條件是什麼...? – stefaanv

+2

['i/= 2'和'i >> = 1'不一樣](https://stackoverflow.com/q/10681375/995714) –

回答

2

鑑於你的平臺是32位的,int i的值(我< < 31)是一個負數。所以,執行永遠不會進入for-loop,因爲你需要i> 0。

+0

是我沒有注意到這個錯誤。它非常有意義。謝謝你指出。很愚蠢的一個錯誤。 –

3

假設二進制補碼,1 << 31的結果爲負值,所以您對i> 0的測試在第一次測試時立即失敗。那麼你很可能會有更多的運氣,然後i != 0

但我們知道1 << 31是一個有符號的整數溢出,無論如何這都是未定義的行爲!所以你也應該做1U << 31。如果將這個正值賦給一個不能保存它的帶符號整數,那麼你又有一個未定義的行爲。所以,正確的for循環應該是這樣的:

for(unsigned int i = 1U << 31; i > 0; i /= 2) 

雖然i /= 2無符號值相當於位位移(並且很可能被編譯),我會明確地在這裏(i >>= 1)prefere的位位移操作,如這是你真正想要的。

+0

啊,我看到..非常感謝..我沒有注意到我自己放在我的循環中的符號條件..感謝指出溢出位!將使用'1U << 31' –