2014-01-21 55 views
3

有人能解释我为什么下面的代码:与右位移位奇怪的行为

#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

不要使用按位补码来设置所有位,而是使用'static_cast ( - 1)',而且会得到预期的结果 – Praetorian

回答

11

~之前完成static_cast<unsigned char>(0)是转换为int(发生整数提升),所以经过~它变成全部位int。然后这被移位并被截断为位集中的8位。

+0

这很令人费解,因为您明确要求使用'unsigned char';但这就是标准所说的。 –

+0

如果您转换为'unsigned int'而不是'unsigned char',那么促销将不会发生。 –

0

在右移,符号值是零填充,如果最显著位为0,并且一个充满如果最显著位为1

使用无符号值部队右移零填充。

+2

仔细看看这个问题,他们试图使用一个无符号的值。 –