为什么无符号的 int 右移总是用"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

问题>为什么无符号的int右移使用1作为填充?

从这个答案中可以看出,无符号的右移总是零填充。但是,请尝试这样做以打印出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"填充。

最新更新