Регистры не имеют значения.Это примерно ширина ваших типов.
Когда вы сдвигаете значение на большее количество бит, чем оно имеет, поведение не определено.Компилятор, программа, компьютер, налоговая инспекция могут юридически проявить любые результаты соответственно.И, нет, это не просто теоретический .
Тем не менее, операнды в C * повышаются до того, как на них сделаны интересные вещи .Итак, ваш uint8_t
становится int
до сдвига влево.
Теперь это зависит от вашей архитектуры (как определено конфигурацией вашего компилятора) относительно того, что происходит: is int
на твоей реализации только 8-битный? Нет, это не так! В результате, независимо от какого-либо "размера регистра", результат должен соответствовать правилам языка, давая математически подходящий ответ (256). И,даже если бы это было так, вы бы столкнулись с этим неопределенным поведением, поэтому вопрос был бы спорным.
Под капотом, если для хранения переменной требуется более одного регистра, то это то, что будет и должно произойти (прикакие бы эксплуатационные расходы не подразумевались в результате).Это если регистр используется вообще ;помните, вы программируете в абстракции, а не в машинном коде ручной работы.Показанный вами фрагмент программы может быть полностью оптимизирован во время компиляции и не требует никаких инструкций во время выполнения вообще .