右移位的奇怪行为

Vin*_*ent 3 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;
}
Run Code Online (Sandbox Code Playgroud)

生产:

11111100
11111111
Run Code Online (Sandbox Code Playgroud)

并不是:

11111100
00111111
Run Code Online (Sandbox Code Playgroud)

yur*_*hek 11

之前~完成static_cast<unsigned char>(0)转换为int(整数提升发生),所以在~它变为全一位之后int.然后将其移位并截断为bitset中的8位.