b = (0xffffffff & x) >> 2;
Предполагая, что ваши целые числа 32-битные, тип литеральной константы 0xffffffff
равен unsigned int
, потому что он слишком велик, чтобы поместиться в обычном int
.&
, тогда, находится между unsigned int
и int
, и в этом случае тип без знака выигрывает по определению.Следовательно, сдвиг происходит без знака;таким образом, он сдвигается на 0 бит слева.
c = (0x0 | x ) >> 2;
Тип 0x0
по умолчанию равен int
, потому что он достаточно мал, чтобы соответствовать, поэтому побитовый или происходит в целых числах, и поэтомуследующая сменаЭто реализация, определяемая тем, что происходит, когда вы сдвигаете целое число со знаком вправо, но большинство компиляторов будет производить арифметическое смещение, расширяющее знак.