Рубрики

Маленькая и Большая Тайна Endian

Что это?
Little and big endian — это два способа хранения многобайтовых типов данных (int, float и т. Д.). В машинах с прямым порядком байтов последний байт двоичного представления многобайтового типа данных сохраняется первым. С другой стороны, в машинах с прямым порядком байтов первый байт двоичного представления многобайтового типа данных сохраняется первым.

Предположим, что целое число хранится в 4 байтах (для тех, кто использует компиляторы на основе DOS, такие как C ++ 3.0, целое число составляет 2 байта), тогда переменная x со значением 0x01234567 будет сохранена следующим образом.

    Память целых чисел ox01234567 внутри больших и младших порядковых машин

Как увидеть представление памяти многобайтовых типов данных на вашем компьютере?
Вот пример кода C, который показывает байтовое представление int, float и pointer.

#include <stdio.h>

  
/ * функция для отображения байтов в памяти, от начала местоположения до начала + n * /

void show_mem_rep(char *start, int n) 

{

    int i;

    for (i = 0; i < n; i++)

         printf(" %.2x", start[i]);

    printf("\n");

}

  
/ * Основная функция для вызова вышеуказанной функции для 0x01234567 * /

int main()

{

   int i = 0x01234567;

   show_mem_rep((char *)&i, sizeof(i));

   getchar();

   return 0;

}

Когда вышеприведенная программа запускается на машине с прямым порядком байтов, выдает «67 45 23 01» в качестве вывода, а если она запускается на машине с прямым порядком байтов, выдает «01 23 45 67» в качестве выхода.

Есть ли быстрый способ определить порядковый номер вашей машины?
Нет. способов определения порядкового номера вашей машины. Вот один быстрый способ сделать то же самое.

C ++

#include <bits/stdc++.h>

using namespace std;

int main() 

    unsigned int i = 1; 

    char *c = (char*)&i; 

    if (*c) 

        cout<<"Little endian"

    else

        cout<<"Big endian"

    return 0; 

  
// Этот код предоставлен rathbhupendra

С

#include <stdio.h>

int main() 

{

   unsigned int i = 1;

   char *c = (char*)&i;

   if (*c)    

       printf("Little endian");

   else

       printf("Big endian");

   getchar();

   return 0;

}


Выход:

Little endian

В вышеприведенной программе символьный указатель c указывает на целое число i. Поскольку размер символа равен 1 байту, когда на указатель символа отменяется ссылка, он будет содержать только первый байт целого числа. Если машина имеет младший порядок байтов, тогда * c будет 1 (потому что последний байт сохраняется первым), а если машина с прямым порядком байтов, тогда * c будет 0.

Имеет ли значение порядок байтов для программистов?

В большинстве случаев компилятор заботится о порядке байтов, однако в следующих случаях он становится проблемой.

Это имеет значение в сетевом программировании: предположим, что вы записываете целые числа в файл на машине с прямым порядком байтов и переносите этот файл на машину с прямым порядком байтов. Если преобразование с прямым порядком байтов в младший не имеет малого значения, машина с прямым порядком байтов будет считывать файл в обратном порядке. Вы можете найти такой практический пример здесь.

Стандартный порядок байтов для сетей с прямым порядком байтов, также известный как сетевой порядок байтов. Перед передачей данных по сети данные сначала преобразуются в сетевой порядок байтов (с прямым порядком байтов).

Иногда это имеет значение, когда вы используете приведение типов, ниже приведен пример программы.

#include <stdio.h>

int main()

{

    unsigned char arr[2] = {0x01, 0x00};

    unsigned short int x = *(unsigned short int *) arr;

    printf("%d", x);

    getchar();

    return 0;

}

В приведенной выше программе массив символов приводится к типу короткого целого без знака. Когда я запускаю вышеупомянутую программу на машине с прямым порядком байтов, я получаю 1 в качестве вывода, а если я запускаю ее на машине с прямым порядком байтов, я получаю 256. Чтобы сделать независимость порядков байтов программ, следует избегать вышеуказанного стиля программирования.

Что такое bi-endians?

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

Каковы примеры маленьких, старших и двоичных машин?
Процессоры на базе Intel — это младшие порядки. Процессоры ARM были мало-порядковыми. Процессоры ARM текущего поколения являются би-байтовыми.

Процессоры Motorola 68K — это большие последовательности. Процессоры PowerPC (от Motorola) и SPARK (от Sun) были с прямым порядком байтов. Текущая версия этих процессоров — bi-endians.

Влияет ли порядок байтов на форматы файлов?

Форматы файлов, которые имеют 1 байт в качестве базовой единицы, не зависят от порядкового номера, например, файлы ASCII. Другие форматы файлов используют некоторый фиксированный формат порядка байтов, например, файлы JPEG хранятся в формате с прямым порядком байтов.


Какой из них лучше — little endian или big endian?

Термин «маленький и большой порядковый номер» пришел из «Путешествий Гулливера» Джонатана Свифта. Две группы не могли прийти к согласию относительно того, к какому концу следует открывать яйцо — маленькое или большое. Как и в случае с яйцами, нет никакой технологической причины выбирать один порядок байтов по сравнению с другим, поэтому аргументы вырождаются в ссору по социально-политическим вопросам. Пока одно из соглашений выбрано и последовательно соблюдено, выбор является произвольным.

Рекомендуемые посты:

Маленькая и Большая Тайна Endian

0.00 (0%) 0 votes