奇怪的位移行为

Odd bit shifting behavior

我有以下有效的 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 位编译它。

What is the reason for this difference?

第 1st 片段 returns 添加两个 unsigned 的结果,结果被(隐式)转换为 int .

第 2nd 片段 returns 添加两个 int 的结果 .


有关“常用算术转换”的更多信息:

  • Usual arithmetic conversions in C : Whats the rationale behind this particular rule
  • C usual arithmetic conversions