2016-04-27 75 views
0
#include <iostream> 
#include <string> 
#include <bitset> 

int main() 
{ 
    char c = 128; 
    unsigned int shift2 = (unsigned int)c; 
    std::string shift2bin = std::bitset<8>(shift2).to_string(); //to binary 
    std::cout << " shift2bin: " << shift2bin << std::endl; 

    unsigned int shift3 = shift2 >> 1; 
    std::string shift3bin = std::bitset<8>(shift3).to_string(); //to binary 
    std::cout << " shift3bin: " << shift3bin << std::endl; 

} 

輸出:爲什麼無符號整型右移總是充滿着「1」

shift2bin: 10000000 
shift3bin: 11000000 

我希望得到的結果如下:

shift2bin: 10000000 
shift3bin: 01000000 

問題>爲什麼無符號整型右移用1作爲填充物?

+1

如果你係統上的'char'是一個有符號的8位類型,這並不罕見,那麼將128賦給'c'可能不是你想要的(我認爲是「實現定義的行爲」)。目前你只打印'shift2'的低8位。嘗試打印出'shift2'的其餘部分,以更深入地瞭解發生了什麼。 –

+2

它使用0作爲填充。二進制中的「shift2」是「11111111111111111111111110000000」。您只輸出最後8位數字;填充位並不重要。 –

+1

答案當然是,無符號右移不使用1作爲填充符。但是由於'unsigned'可能超過8位,所以你不會看到移入的填充位;你會看到'shift2'的第9位有1。可能是因爲'c'是一個有符號的類型並被分配了一個負值。 –

回答

3

如所看到的in this answer,無符號右移總是零填充。然而,試試這個在unsigned int打印出所有的位:

std::string shift2bin = std::bitset<sizeof(shift2)*8>(shift2).to_string(); //to binary 
std::cout << " shift2bin: " << shift2bin << std::endl; 

你會看到類似的信息(如你似乎有默認符號字符):

shift2bin: 11111111111111111111111110000000 
            ^^^^^^^^ 

如果你做同樣的爲shift3bin,您將看到:

shift3bin: 01111111111111111111111111000000 
            ^^^^^^^^ 

所以,你可以看到你的顯示獲得「1」填充。