Компиляторы не обязаны переводить вашу программу, дословно (или как вы ожидаете) на ассемблер или машинный язык.Компиляторы могут свободно переводить вашу программу, если ее поведение остается неизменным в рамках языкового стандарта.Если ваша программа вызывает неопределенное поведение, поведение платформы или поведение, определенное компилятором, все ставки отключены.
Компиляторы часто могут не кодировать сдвиги с константами.Вместо этого они могут вычислить значения во время компиляции и загрузить значения.Они могут выбрать умножение или деление, а не сдвиг.
Более умные компиляторы могут оценить ваши выражения и использовать более эффективную формулу для получения ответа.С другой стороны, компиляторы также могут исключать сдвиги, ответы на которые не используются.
Я предлагаю сосредоточиться на правильности и надежности вашей программы, а не беспокоиться о том, как компилятор оптимизирует код.После того, как ваша программа работает правильно и устойчива, оптимизируйте, если у вас есть дополнительное время или размер программы или скорость выполнения неудовлетворительны.