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位二進制
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位二進制
鑑於你的平臺是32位的,int i的值(我< < 31)是一個負數。所以,執行永遠不會進入for-loop,因爲你需要i> 0。
是我沒有注意到這個錯誤。它非常有意義。謝謝你指出。很愚蠢的一個錯誤。 –
假設二進制補碼,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的位位移操作,如這是你真正想要的。
啊,我看到..非常感謝..我沒有注意到我自己放在我的循環中的符號條件..感謝指出溢出位!將使用'1U << 31' –
什麼是有符號32位變量的數字0x80000000 ....? – LPs
循環的最終條件是什麼...? – stefaanv
['i/= 2'和'i >> = 1'不一樣](https://stackoverflow.com/q/10681375/995714) –