0
#include <iostream>
#include <string>
#include <bitset>
int main()
{
char c = 128;
unsigned int shift2 = (unsigned int)c;
std::string shift2bin = std::bitset<8>(shift2).to_string(); //to binary
std::cout << " shift2bin: " << shift2bin << std::endl;
unsigned int shift3 = shift2 >> 1;
std::string shift3bin = std::bitset<8>(shift3).to_string(); //to binary
std::cout << " shift3bin: " << shift3bin << std::endl;
}
shift2bin: 10000000
shift3bin: 11000000
我希望得到的结果如下:
shift2bin: 10000000
shift3bin: 01000000
问题>为什么无符号整型右移用1作为填充物?
如果你系统上的'char'是一个有符号的8位类型,这并不罕见,那么将128赋给'c'可能不是你想要的(我认为是“实现定义的行为”)。目前你只打印'shift2'的低8位。尝试打印出'shift2'的其余部分,以更深入地了解发生了什么。 –
它使用0作为填充。二进制中的“shift2”是“11111111111111111111111110000000”。您只输出最后8位数字;填充位并不重要。 –
答案当然是,无符号右移不使用1作为填充符。但是由于'unsigned'可能超过8位,所以你不会看到移入的填充位;你会看到'shift2'的第9位有1。可能是因为'c'是一个有符号的类型并被分配了一个负值。 –