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

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

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

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

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

Я имею в виду следующие операторы:

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

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

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


person Frank V    schedule 24.06.2009    source источник
comment
Перечисленные вами операторы являются побитовыми, а не логическими. Логические операции в C: &&, || и !.   -  person sth    schedule 24.06.2009
comment
побитовый оператор not влияет на бит знака. Но значение не становится беззнаковым. Результатом ~ для целочисленного типа со знаком является, как и следовало ожидать, любое значение со знаком, имеющее битовый шаблон, который вычисляется путем переворота каждого бита ввода. Итак, ~ отрицательного значения всегда неотрицательно, а ~ неотрицательного значения всегда отрицательно.   -  person Steve Jessop    schedule 24.06.2009


Ответы (3)


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

person Adam Rosenfield    schedule 24.06.2009
comment
Правильно, порядок байтов не имеет значения, пока вы не начнете обращаться к отдельным байтам целого числа через арифметические операции с указателями / адресацию. Также, к вашему сведению, перечисленные операторы не зависят от подписи, но оператор сдвига вправо >> может. - person John Kugelman; 24.06.2009
comment
Итак, ~ 54321 всегда будет приводить к 703710? - person Frank V; 24.06.2009
comment
Нет, биты будут такими же, но числовые значения будут интерпретироваться по-разному. Для целых чисел с дополнением до двух со знаком ~ n = -n-1. ~ 4321 = -4322 - person John Kugelman; 24.06.2009

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

person Alex Martelli    schedule 24.06.2009
comment
Да, я указываю на то, что зависимость зависит от арифметики с дополнением до двух (которая, насколько мне известно, была почти универсальной для процессоров для поколения [людей ;-)] или более), а не от порядка байтов. - person Alex Martelli; 25.06.2009

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

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

person sth    schedule 25.06.2009