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