为什么unsigned int右移总是补'1'
Why unsigned int right shift is always filled with '1'
#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
问题>为什么unsigned int右移用1补位?
正如所见in this answer,无符号右移总是零填充。但是,尝试打印出 unsigned int
:
中的所有位
std::string shift2bin = std::bitset<sizeof(shift2)*8>(shift2).to_string(); //to binary
std::cout << " shift2bin: " << shift2bin << std::endl;
您会看到类似的内容(因为您似乎默认已对字符进行签名):
shift2bin: 11111111111111111111111110000000
^^^^^^^^
如果您对 shift3bin
执行相同的操作,您将看到:
shift3bin: 01111111111111111111111111000000
^^^^^^^^
因此,您可以看到您看起来如何获得“1”填充。
#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
问题>为什么unsigned int右移用1补位?
正如所见in this answer,无符号右移总是零填充。但是,尝试打印出 unsigned int
:
std::string shift2bin = std::bitset<sizeof(shift2)*8>(shift2).to_string(); //to binary
std::cout << " shift2bin: " << shift2bin << std::endl;
您会看到类似的内容(因为您似乎默认已对字符进行签名):
shift2bin: 11111111111111111111111110000000
^^^^^^^^
如果您对 shift3bin
执行相同的操作,您将看到:
shift3bin: 01111111111111111111111111000000
^^^^^^^^
因此,您可以看到您看起来如何获得“1”填充。