奇数位移位行为

时间:2017-09-22 15:48:33

标签: c implicit-conversion integer-promotion

我有以下可用的C代码:

int ex(unsigned int x) {
    int mask  = 0x55555555;
    int a = ((x >> 0) & mask );
    return a + ((x >> 1) & mask );
}

然而,当我将其扩展到此时,我得到了不同的结果:

int ex(unsigned int x) {
    int mask  = 0x55555555;
    int a = ((x >> 0) & mask );
    int b = ((x >> 1) & mask );
    return a + b;
}

造成这种差异的原因是什么?

编辑: 注意,我正在为32位编译它。

1 个答案:

答案 0 :(得分:39)

  

造成这种差异的原因是什么?

1 st 片段返回添加两个unsigned的结果,其结果是(隐式)转换为int

2 nd 片段返回添加两个int s的结果。

更多关于" 通常的算术转换":