web-dev-qa-db-ja.com

奇数ビットシフト動作

私は動作する次の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ビット用にコンパイルしています。

28
cdignam

この違いの理由は何ですか?

1st スニペットは、2つのunsignedを追加した結果を返し、その結果は(暗黙的に)intに変換されます。

2nd スニペットは、2つのintsを追加した結果を返します。


通常の算術変換」の詳細:

39
alk