Правильный порядок сдвига битов в c - PullRequest
0 голосов
/ 30 января 2019

В чем разница и почему существуют 3 (???) разные результаты?

signed char b;
b = 66 << 2 >> 8;
fprintf(stdout, "%d\n", b);

Вывод: "1"

signed char b;
b = 66 << 2;
b = b >> 8;
fprintf(stdout, "%d\n", b);

Вывод: "0"

signed char b;
b = 2 >> 8;
b = 66 << b;
fprintf(stdout, "%d\n", b);

Вывод: "66"

спасибо за помощь!

1 Ответ

0 голосов
/ 30 января 2019
signed char b = 66 << 2 >> 8;

Здесь 66 << 2 становится signed int 264 (signed int, потому что это промежуточный результат), которое сдвигается >> 8, что становится 1.

signed char b = 66 << 2;

Здесь264 (то же, что и выше) «вдавливается» в signed char, превращая его в 8. Применение >> 8 здесь приводит к 0.

Ну, а ваш третий пример, 2 >> 8 явно0, поэтому 66 остается без изменений.

...