Зависит ли сдвиг битов от порядка байтов? - PullRequest
4 голосов
/ 07 августа 2020

Я понимаю, что если я хочу выполнить 2 n , то я могу выполнить (0x1ul << n) и получу результат.

Что, если процессор с прямым порядком байтов? Если я сделаю сдвиг влево, не приведет ли это к неправильному выводу? Будет ли (0x1ul << n) неправильным, т.е. не равным 2 n , когда у нас есть архитектура с прямым порядком байтов? Как я могу это доказать?

Ответы [ 3 ]

4 голосов
/ 07 августа 2020

Порядок байтов имеет смысл только тогда, когда вы разбиваете многобайтовое количество и пытаетесь сохранить байты в последовательных ячейках памяти. Однако, если у вас есть 32-битный регистр, в котором хранится 32-битное значение, нет смысла говорить о порядке байтов. Регистр не является ни прямым, ни прямым; это просто регистр, содержащий 32-битное значение. Крайний правый бит - это младший бит, а крайний левый бит - самый старший бит.

То же самое в этой ситуации, когда значение переменной загружается из памяти в регистр для сдвига, не имеет значения, какой это порядок байтов, все, что он делает, это сдвиг, как указано, и сохранение в памяти.

Ссылка: Запись независимого от порядкового номера кода в C

2 голосов
/ 07 августа 2020

Источник вашего замешательства, кажется, в том, что означает «левый» и «правый». В смысле операторов << и >> их значения находятся в обычном арифметическом c смысле, когда цифры записываются от наименее значимых справа до наиболее значимых слева. Фактически C определяет эти операторы как операторы arithmeti c, а не побитовые операторы, как умножение или деление на соответствующую степень двойки для входных данных, для которых они определены.

В частности, эти операторы не перемещают биты «влево» или «вправо» «в памяти»; они действуют даже не на память, а на ценности. Иногда имеет смысл подумать об их использовании для перемещения байтов в памяти (со сдвигами, кратными 8), и в этом случае, нужно ли вам << или >> для перемещения байтов «влево» «в память» (в представлении) зависит от того, является ли представление прямым или обратным порядком байтов. Вы видите, что это встречается в таких местах, как , эта реализация memcpy для ARM, которая работает на старых чипах без поддержки несогласованного доступа .

0 голосов
/ 07 августа 2020

Будет ли (0x1ul << n) неправильным, т.е. не равным 2n, когда у нас есть архитектура с прямым порядком байтов? </p>

Нет, а 0x1ul << n вписывается в unsigned long, все хорошо. Порядок байтов (или битов) не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...