奇怪的行为,正确的位移动

Strange behaviour with right bit shift

本文关键字:移动      更新时间:2023-10-16

有人可以解释我为什么以下代码:

#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

~完成之前,static_cast<unsigned char>(0)转换为int(Integer促销发生),因此~变成了All-One-One Bits int。然后将其移动并截断为块中的8位。

在右移上,如果最重要的位为0,则签名值在零上填充,如果最重要的位是1。

使用无符号值将右偏移零填充。