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
остается без изменений.