Запишите программу, чтобы определить, с обратным порядком байтов ли компьютер или с прямым порядком байтов.
bool endianness() {
int i = 1;
char *ptr;
ptr = (char*) &i;
return (*ptr);
}
Таким образом, у меня есть вышеупомянутая функция. Я действительно не получаю его. ptr = (символ*) &i, который я думаю, означает указатель на символ в адресе того, где я сижу, поэтому если интервал составляет 4 байта скажем ABCD, мы говорим о A или D, когда Вы называете символ* на этом? и почему?
Кто-то объяснил бы это более подробно?Спасибо.
Таким образом а именно, ptr = (символ*) &i; когда Вы бросаете его для обугливания*, какую часть &i я получаю?
Если у вас архитектура с прямым порядком байтов, i
будет выглядеть в памяти следующим образом (в шестнадцатеричном формате):
01 00 00 00
^
Если вы имеют архитектуру с прямым порядком байтов, i
будет выглядеть в памяти (в шестнадцатеричном формате) следующим образом:
00 00 00 01
^
Приведение к char *
дает вам указатель на первый байт int (на который я указал ^
), поэтому значение, на которое указывает char *
, будет 01
, если вы используете архитектуру с прямым порядком байтов. и 00
, если вы используете архитектуру с прямым порядком байтов.
Когда вы возвращаете это значение, 0
преобразуется в false
, а 1
преобразуется в true
. Итак, если у вас архитектура с прямым порядком байтов, эта функция вернет true
, а если у вас архитектура с прямым порядком байтов, она вернет false
.
Если ptr
указывает на байт A или D, это зависит от порядка байтов машины. ptr
указывает на тот байт целого числа, который находится по младшему адресу (другие байты будут по адресу ptr + 1
, ...).
На машине с прямым порядком байтов самый значимый байт целого числа (который равен 0x00
) будет сохранен по этому наименьшему адресу, поэтому функция вернет ноль.
На машине с прямым порядком байтов все наоборот, наименьший значащий байт целого числа ( 0x01
) будет сохранен по наименьшему адресу, поэтому функция вернет единицу. в этом случае.
Независимо от того, является ли * ((char *) & i)
байтом A или байтом D, мы доходим до сути порядка байтов. В системе с прямым порядком байтов целое число 0x41424344 будет размещено в памяти как: 0x44 43 42 41 (сначала младший байт; в ASCII это «DCBA»). В системе с прямым порядком байтов это будет выглядеть так: 0x41 42 43 44. Указатель на это целое число будет содержать адрес первого байта. Рассматривая указатель как целочисленный указатель, вы получаете целое число. Считайте указатель указателем на символ, и вы получите первый байт, поскольку он равен размеру символа.
Используется каламбур для доступа к целому числу как к массиву символов. Если машина с прямым порядком байтов, это будет старший байт с нулевым значением, но если машина с прямым порядком байтов, это будет младший байт, который будет иметь значение, равное единице. (Вместо доступа к i
как к единственному целому числу, к той же памяти обращаются как к массиву из четырех символов).
Конечно,
Давайте посмотрим
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
Предположим, что 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 истинно, то у вас есть обратный порядок байтов.