Кто-то может объяснить эту функцию “порядка байтов” для меня?

Запишите программу, чтобы определить, с обратным порядком байтов ли компьютер или с прямым порядком байтов.

bool endianness() {
     int i = 1;
     char *ptr;
     ptr  = (char*) &i;
     return (*ptr);
}

Таким образом, у меня есть вышеупомянутая функция. Я действительно не получаю его. ptr = (символ*) &i, который я думаю, означает указатель на символ в адресе того, где я сижу, поэтому если интервал составляет 4 байта скажем ABCD, мы говорим о A или D, когда Вы называете символ* на этом? и почему?

Кто-то объяснил бы это более подробно?Спасибо.

Таким образом а именно, ptr = (символ*) &i; когда Вы бросаете его для обугливания*, какую часть &i я получаю?

11
задан SIr Codealot 28 March 2010 в 00:52
поделиться

6 ответов

Если у вас архитектура с прямым порядком байтов, i будет выглядеть в памяти следующим образом (в шестнадцатеричном формате):

01 00 00 00
^

Если вы имеют архитектуру с прямым порядком байтов, i будет выглядеть в памяти (в шестнадцатеричном формате) следующим образом:

00 00 00 01
^

Приведение к char * дает вам указатель на первый байт int (на который я указал ^ ), поэтому значение, на которое указывает char * , будет 01 , если вы используете архитектуру с прямым порядком байтов. и 00 , если вы используете архитектуру с прямым порядком байтов.

Когда вы возвращаете это значение, 0 преобразуется в false , а 1 преобразуется в true . Итак, если у вас архитектура с прямым порядком байтов, эта функция вернет true , а если у вас архитектура с прямым порядком байтов, она вернет false .

33
ответ дан 3 December 2019 в 01:51
поделиться

Если ptr указывает на байт A или D, это зависит от порядка байтов машины. ptr указывает на тот байт целого числа, который находится по младшему адресу (другие байты будут по адресу ptr + 1 , ...).

На машине с прямым порядком байтов самый значимый байт целого числа (который равен 0x00 ) будет сохранен по этому наименьшему адресу, поэтому функция вернет ноль.

На машине с прямым порядком байтов все наоборот, наименьший значащий байт целого числа ( 0x01 ) будет сохранен по наименьшему адресу, поэтому функция вернет единицу. в этом случае.

2
ответ дан 3 December 2019 в 01:51
поделиться

Независимо от того, является ли * ((char *) & i) байтом A или байтом D, мы доходим до сути порядка байтов. В системе с прямым порядком байтов целое число 0x41424344 будет размещено в памяти как: 0x44 43 42 41 (сначала младший байт; в ASCII это «DCBA»). В системе с прямым порядком байтов это будет выглядеть так: 0x41 42 43 44. Указатель на это целое число будет содержать адрес первого байта. Рассматривая указатель как целочисленный указатель, вы получаете целое число. Считайте указатель указателем на символ, и вы получите первый байт, поскольку он равен размеру символа.

0
ответ дан 3 December 2019 в 01:51
поделиться

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

1
ответ дан 3 December 2019 в 01:51
поделиться

Конечно,

Давайте посмотрим

bool endianness() {
     int i = 1; //This is 0x1:
     char *ptr;
     ptr  = (char*) &i; //pointer to 0001
     return (*ptr);
}

Если машина с прямым порядком байтов, тогда данные будут в формате * ptr будет 0000 0001.

Если машина с прямым порядком байтов, то данные будут инвертированы, то есть i будет

i = 0000 0000 0000 0001 0000 0000 0000 0000 

Итак, * ptr будет содержать 0x0

Наконец, возврат * ptr эквивалентно

if (*ptr = 0x1 ) //little endian

else //big endian
0
ответ дан 3 December 2019 в 01:51
поделиться

Предположим, что int составляет 4 байта (в C это может быть не так). Это предположение сделано для упрощения примера ...

Вы можете рассматривать каждый из этих 4 байтов по отдельности.

char - это байт, поэтому он смотрит на первый байт 4-байтового буфера.

Если первый байт не равен 0, это говорит вам, содержится ли младший бит в первом байте.

Я произвольно выбрал число 42, чтобы избежать путаницы с любым специальным значением в значении 1.

int num = 42;
if(*(char *)&num == 42)
{
      printf("\nLittle-Endian\n");
}
else
{
      printf("Big-Endian\n");
}

Разбивка:

int num = 42; 
//memory of the 4 bytes is either: (where each byte is 0 to 255)
//1) 0 0 0 42
//2) 42 0 0 0

char*p = #/*Cast the int pointer to a char pointer, pointing to the first byte*/
bool firstByteOf4Is42 = *p == 42;/*Checks to make sure the first byte is 1.*/

//Advance to the 2nd byte
++p;
assert(*p == 0);

//Advance to the 3rd byte
++p;
assert(*p == 0);

//Advance to the 4th byte
++p;
bool lastByteOf4Is42 = *p == 42;
assert(firstByteOf4Is42 == !lastByteOf4Is42);

Если firstByteOf4Is42 истинно, у вас прямой порядок байтов. Если lastByteOf4Is42 истинно, то у вас есть обратный порядок байтов.

0
ответ дан 3 December 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: