Поразрядные операторы и "endianness"

Имеет ли endianness материальное значение с побитовыми операциями? Либо логический, либо смещение?

Я работаю над домашними заданиями относительно поразрядных операторов, и я не могу делать на них головы или хвосты, и я думаю, что я полностью зависаю от энтианс. То есть, я использую маленькую конечную машину (как и большинство из них), но нужно ли это рассматривать или это потерянный факт?

В случае, если это имеет значение, я использую C.

Ответ 1

Endianness имеет значение только для размещения данных в памяти. Как только данные загружаются процессором, на который будет работать, континент совершенно не имеет значения. Сдвиги, побитовые операции и т.д. Выполняются так, как вы ожидали (данные логически выложены как бит младшего разряда в высоту), независимо от его суждения.

Ответ 2

Поразрядные операторы абстрагируют утверждение. Например, оператор >> всегда сдвигает биты в сторону наименьшей значащей цифры. Однако это не означает, что вы можете полностью игнорировать его при использовании, например, при работе с отдельными байтами в более крупной структуре вы не всегда можете предположить, что они упадут в одном и том же месте.

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

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

Ответ 3

Как отмечали другие, сдвиги определяются спецификацией языка C и не зависят от сущности, но реализация сдвига вправо может варьироваться в зависимости от того, использует ли архитектура одну или две дополнительные арифметики.

Ответ 4

Это зависит. Без ввода числа в новый тип вы можете прозрачно относиться к контенту.

Однако, если ваша операция связана с каким-то новым типом, используйте свою осторожность.

Например, если вы хотите, чтобы правый сдвиг некоторых битов и передача (явно или нет) в новый тип, имеет значение endianness!

Чтобы проверить свою сущность, вы можете просто нарисовать int в char:

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);

Ответ 5

Вы не указали язык, но обычно такие языки программирования, как C abstract endianness, в побитовых операциях. Так что нет, это не имеет значения в побитовых операциях.

Ответ 6

Тогда какое должно быть значение "numChar1" и "numChar2" в следующем коде языка C в Motorola PowerPC MPC565 (Big Endian)

unsigned short numUShort = 0xA000;
unsigned char  numChar1   = 0x00;
unsigned char  numChar2   = 0x00;

void main ()
{
   numChar1 = (unsigned char)((0xFF00 & numUShort));
   numChar2 = (unsigned char)((0xFF00 & numUShort)>>8);
}