有人可以解释一下为什么以下代码:
#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
答案 0 :(得分:11)
在~
完成之前static_cast<unsigned char>(0)
转换为int
(发生整数提升),因此在~
之后它变为全1位int
。然后将其移位并在位集中截断为8位。
答案 1 :(得分:0)
在右移时,如果最高有效位为0,则有符号值将为零填充;如果最高有效位为1,则有符号值为零填充。
使用无符号值会强制右移零填充。