为什么unsigned int右移始终用'1'填充

时间:2016-04-27 00:39:27

标签: c++ bit-manipulation

#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;

}

输出:

 shift2bin: 10000000
 shift3bin: 11000000

我希望结果如下:

 shift2bin: 10000000
 shift3bin: 01000000

问题&GT;为什么unsigned int right shift使用1作为填充符?

1 个答案:

答案 0 :(得分: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”填充。