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'是一個有符號的類型並被分配了一個負值。 –