奇数位移位行为

cdi*_*nam 28 c integer-promotion implicit-conversion

我有以下C代码工作:

int ex(unsigned int x) {
    int mask  = 0x55555555;
    int a = ((x >> 0) & mask );
    return a + ((x >> 1) & mask );
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

alk*_*alk 39

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

1个ST段返回增加两个的结果unsigned与所述结果是S(隐式地)转换为int.

的2 片断返回增加两个的结果int秒.


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