Подтвердить что ты не робот

Нечетное смещение битов

У меня есть следующий код 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;
}

В чем причина этой разницы?

EDIT: Заметьте, я компилирую это для 32bit.

4b9b3361

Ответ 1

В чем причина этой разницы?

Фрагмент 1 st возвращает результат добавления двух unsigned, при этом результат (неявно) преобразуется в int.

Фрагмент 2 nd возвращает результат добавления двух int.


Подробнее о "Обычные арифметические преобразования":