2014-01-21 92 views
3

有人能解釋我爲什麼下面的代碼:與右位移位奇怪的行爲

#include <iostream> 
#include <bitset> 

int main() 
{ 
    unsigned char i = 2; 
    std::cout<<std::bitset<8>((~static_cast<unsigned char>(0)) << i)<<std::endl; 
    std::cout<<std::bitset<8>((~static_cast<unsigned char>(0)) >> i)<<std::endl; 
    return 0; 
} 

產地:

11111100 
11111111 

,而不是:

11111100 
00111111 
+0

不要使用按位補碼來設置所有位,而是使用'static_cast ( - 1)',而且會得到預期的結果 – Praetorian

回答

11

~之前完成static_cast<unsigned char>(0)是轉換爲int(發生整數提升),所以經過~它變成全部位int。然後這被移位並被截斷爲位集中的8位。

+0

這很令人費解,因爲您明確要求使用'unsigned char';但這就是標準所說的。 –

+0

如果您轉換爲'unsigned int'而不是'unsigned char',那麼促銷將不會發生。 –

0

在右移,符號值是零填充,如果最顯著位爲0,並且一個充滿如果最顯著位爲1

使用無符號值部隊右移零填充。

+2

仔細看看這個問題,他們試圖使用一個無符號的值。 –