Поразрядные операторы и "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);
}