Это вызвано комбинацией неопределенного поведения в C и фактом, что код, созданный для процессоров IA-32, имеет 5-битную маску, применяемую к счету сдвига. Это означает, что на процессорах IA-32 диапазон смещения рассчитывается только 0-31. 1
Из Язык программирования C 2
Результат не определен, если правый операнд отрицательный, или больше или равно количеству бит в типе левого выражения.
blockquote>Из IA-32 Руководство разработчика программного обеспечения Intel Architecture 3
8086 не маскирует количество сдвигов. Однако все остальные процессоры IA-32 (начиная с процессора Intel 286) маскируют счетчик сдвига до 5 бит, что приводит к максимальному счету 31. Эта маскировка выполняется во всех режимах работы (включая режим виртуального 8086) до уменьшите максимальное время выполнения инструкций.
blockquote>
1 http://codeyarns.com/2004/12/20/c- shift-operator-mayhem /
2 A7.8 Операторы сдвига, Приложение A. Справочное руководство, Язык программирования C
3 SAL / SAR / SHL / SHR - Shift, глава 4. Справочник по набору инструкций, Руководство разработчика программного обеспечения для архитектуры Intel IA-32