На большинстве компиляторов оба будут давать результат с одинаковым представлением. Однако, согласно спецификации C, результат операции сдвига битов со знаковым аргументом дает результаты, определенные реализацией, поэтому в теории 1U << i
является более переносимым, чем 1 << i
. На практике все компиляторы Си, с которыми вы когда-либо сталкивались, обращаются со знаковыми левыми сдвигами так же, как со знаковыми левыми сдвигами.
Другая причина заключается в том, что если nSize
не подписано, то сравнение его со знаком 1 << i
вызовет предупреждение компилятора. Изменение 1
на 1U
избавляет от предупреждающего сообщения, и вам не нужно беспокоиться о том, что произойдет, если i
равно 31 или 63.
Предупреждение компилятора, скорее всего, является причиной появления в коде 1U
. Я предлагаю компилировать C с большинством включенных предупреждений и удалять предупреждающие сообщения путем изменения кода.