C++ 具有正确位移位的奇怪行为

C++ 具有正确位移位的奇怪行为,c++,bit-manipulation,bit-shift,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::bitse

有人能解释一下为什么会出现以下代码:

#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
00111111

~
完成之前
静态\u转换(0)
转换为
int
(整数提升发生),因此
~
之后它变成所有一位
int
。然后将其移位并截断为位集中的8位。

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


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

这相当令人困惑,因为您明确要求使用
无符号字符
;但这就是标准所说的。如果您将转换为
无符号int
而不是
无符号char
,那么升级就不会发生。仔细看这个问题,他们试图使用无符号值。不要使用位补码来设置所有位,而是使用
静态转换(-1)
,您将得到预期的结果
11111100
00111111