Побитовый оператор Not (~ в C) относительно порядка с прямым и обратным порядком байтов

StackOverflow https://stackoverflow.com/questions/1036141

  •  10-07-2019
  •  | 
  •  

Вопрос

Это относится к домашнему заданию, но это не домашнее задание.

Я с трудом понимаю, есть ли разница в том, как побитовое нет ( ~ в C) повлияло бы на signature int и unsigned int когда скомпилирован на большой машине с порядком байтов или маленькой машине с порядком байтов.

Являются ли байты действительно " задом наперед " и если да, то побитовые нет (и другие операторы) приводят к разным результирующим int s в зависимости от типа машины?

Пока мы находимся в этом вопросе, одинаков ли ответ для каждого из побитовых операторов в C или он сильно зависит?

Операторы, на которых я ссылаюсь:

~  /* bitwise Not */
&  /* bitwise And */
|  /* bitwise Or */
^  /* bitwise Exclusive-Or */

Заранее спасибо!

Обновление . Пока я читаю свои ответы, я вынужден спросить, влияет ли побитовый оператор not на бит знака в подписанном int . Боюсь, я немного запутался в этой части, так как забыл обо всей этой глупости. Кажется, Адам заявляет, что все значения рассматриваются как неподписанные. Повторно применяется символьный бит или однозначное значение становится беззнаковым?

Это было полезно?

Решение

Битовые и логические операторы работают одинаково на машинах с прямым и младшим порядком байтов. Кроме того, они также одинаково работают с подписанными и неподписанными данными: в результате получается, что все было без знака. Итак, если x и y являются целыми числами со знаком, то ~ x равно (int) (~ ((unsigned int) x) и x & amp; y равно (int) (((unsigned int) x) & amp; ((unsigned int) y) и т. д. для всех других операторов.

Другие советы

Как говорится в ответе @ Adam, так как эти операторы идут по крупицам, порядок байтов на самом деле не имеет значения! Например, (~ x) == (-x-1) для каждого подписанного целого числа x , независимо от длины x в байтах И независимо от того, является ли машина порядком байтов (если она использует арифметику с двумя дополнениями - есть ли еще те, которые этого не делают?)

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

Битовые операторы всегда действуют на все биты своих аргументов и влияют на разные битовые позиции индивидуально (бит № 5 в результате зависит только от бит № 5 на входах). Они не заботятся о порядке, в котором хранятся биты, или если некоторые из битов могут иметь особое значение для типа данных, они просто обрабатывают их все. Так что здесь порядок байтов также не имеет значения, поскольку затрагиваются все биты, независимо от их порядка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top