2016-11-17 87 views
1

我有此片段的代碼的一個問題:位移爲32個64的無符號整數

uint32_t c = 1 << 31; 
uint64_t d = 1 << 31; 
cout << "c: " << std::bitset<64>(c) << endl; 
cout << "d: " << std::bitset<64>(d) << endl; 
cout << (c == d ? "equal" : "not equal") << endl; 

結果是:

c: 0000000000000000000000000000000010000000000000000000000000000000 
d: 1111111111111111111111111111111110000000000000000000000000000000 
not equal 

是的,我知道關於「d」的溶液是使用'1ULL'。但我不明白爲什麼會發生這種情況時,轉變是31位。我在某處讀到可以安全移動大小爲1的位,所以如果我寫入沒有'UUL'的指令並且文字'1'是32位長,那麼將它移位31位應該是安全的,對嗎? 我在這裏錯過了什麼?

問候

YotKay

+0

對。謝謝! 「 – YotKay

+2

」是的,我知道'd'的解決方案是使用'1ULL'。「你知道錯了,在這種情況下1U就足夠了。 – Slava

回答

1

的問題是,你左移,即恆定1的表達,被作爲一個符號整數處理。這就是爲什麼編譯器在之前執行符號擴展的原因將結果分配給d,導致您看到的結果。

將後綴U添加到1將解決問題(demo)。

uint64_t d = 1U << 31; 
+0

沒錯。非常感謝! – YotKay

相關問題