为什么unsigned int右移总是补'1'

Why unsigned int right shift is always filled with '1'

#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

问题>为什么unsigned int右移用1补位?

正如所见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”填充。