Отредактировано: Проблема почти наверняка связана с тем фактом, что «b» является «int», а не «long».
В C, если 'b' является целым числом вместо длинного и вы сдвигаете влево на 32 бита, все биты из исходного значения были удалены, поэтому результат общего выражения будет таким же как 'c' вы бы вызвали неопределенное поведение, поэтому любой результат допустим. Java определяет вещи по-разному - как отмечено в комментарии Расмуса Фабера и в выбранном ответе - и выполняет слишком длинные сдвиги по модулю максимального числа битов, которые можно сдвинуть. [Это кажется странным способом ведения бизнеса; Я бы, наверное, договорился об исключении на языке, который их имеет. Тем не менее, он четко определен, что более важно, чем точное определение.] Приведение к 64-битным кодам не происходит во время вычисления выражения; это происходит, когда выражение завершено и происходит присвоение.
Ссылка на 5 битов ... интригует. Это означает, что если вы сдвигаете влево, скажем, на 48, или двоичную 110000, это то же самое, что сдвиг влево на 16. Или, альтернативно, 'x << n
' совпадает с 'x << (n % 32)
'.