右移位的奇怪行为

时间:2014-01-21 22:53:12

标签: c++ bit-manipulation bit-shift

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

#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

2 个答案:

答案 0 :(得分:11)

~完成之前static_cast<unsigned char>(0)转换为int(发生整数提升),因此在~之后它变为全1位int。然后将其移位并在位集中截断为8位。

答案 1 :(得分:0)

在右移时,如果最高有效位为0,则有符号值将为零填充;如果最高有效位为1,则有符号值为零填充。

使用无符号值会强制右移零填充。