Поведение, которое вы видите здесь, связано со смещением целых чисел со знаком или без знака, которые дают разные результаты.Сдвиги на целых числах без знака логические .Наоборот, сдвиг на целых числах со знаком равен арифметике . EDIT: В C это реализация определена, но обычно регистр.
Следовательно,
int x = 0xfffffffe;
int a = x >> 16;
эта часть выполняет арифметическое смещение, потому что x подписано .И поскольку x на самом деле отрицательный (-2 в дополнении к двум), x означает знак расширения , поэтому добавляются '1', что приводит к 0xFFFFFFFF.
Наоборот,
int b = 0xfffffffe >> 16;
0xfffffffe - это буква, интерпретируемая как целое число без знака .Поэтому логическое смещение 16 приводит к 0x0000FFFF, как и ожидалось.