2016-04-27 36 views
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; 

} 

输出:为什么无符号整型右移总是充满着“1”

shift2bin: 10000000 
shift3bin: 11000000 

我希望得到的结果如下:

shift2bin: 10000000 
shift3bin: 01000000 

问题>为什么无符号整型右移用1作为填充物?

+1

如果你系统上的'char'是一个有符号的8位类型,这并不罕见,那么将128赋给'c'可能不是你想要的(我认为是“实现定义的行为”)。目前你只打印'shift2'的低8位。尝试打印出'shift2'的其余部分,以更深入地了解发生了什么。 –

+2

它使用0作为填充。二进制中的“shift2”是“11111111111111111111111110000000”。您只输出最后8位数字;填充位并不重要。 –

+1

答案当然是,无符号右移不使用1作为填充符。但是由于'unsigned'可能超过8位,所以你不会看到移入的填充位;你会看到'shift2'的第9位有1。可能是因为'c'是一个有符号的类型并被分配了一个负值。 –

回答

3

如所看到的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”填充。