Что делает систему мало-endian или big-endian?

Я запутался с порядком байта системы /cpu/program.
Поэтому я должен задать некоторые вопросы, чтобы понять мой разум.

Вопрос 1

Если я использую только тип char в моей программе на С++:

void main()
{
    char c = 'A';
    char* s = "XYZ";    
}

Затем скомпилируйте эту программу в исполняемый двоичный файл с именем a.out.
Может ли a.out работать в системах с маленькими и большими рядами?

Вопрос 2

Если моя система Windows XP является малодушной, могу ли я установить большую систему Linux в VMWare/VirtualBox? Что делает систему мало-endian или big-endian?

Вопрос 3

Если я хочу написать независимую по байтам программу на С++, что мне нужно учитывать?

Ответ 1

Может ли a.out работать в системе little-endian и big-endian?

Нет, потому что почти любые два процессора, которые настолько отличаются друг от друга, что имеют разные конечные значения, не будут запускать один и тот же набор команд. С++ - это не Java; вы не компилируете что-то, что компилируется или интерпретируется. Вы собираете сборку для конкретного процессора. И endial-ness является частью процессора.

Но это вне экзистенциальных вопросов. Вы можете скомпилировать эту программу для разных ЦП, и эти исполняемые файлы будут отлично работать на своих процессорах.

Что делает систему мало-endian или big-endian?

Что касается C или С++, то CPU. У разных процессоров на компьютере могут быть разные континцы (графический процессор может быть большим, в то время как процессор немногочисленный), но это несколько необычно.

Если я хочу написать независимую программу на С++, то что мне нужно учитывать?

Пока вы играете по правилам C или С++, вам не нужно беспокоиться о проблемах с endian.

Конечно, вы также не сможете загружать файлы напрямую в структуры POD. Или прочитайте серию байтов, притворите, что это серия неподписанных шорт, а затем обработайте ее как строку с кодировкой UTF-16. Все эти вещи входят в сферу поведения, определяемого реализацией.

Существует разница между "undefined" и "реализацией". Когда спецификация C и С++ говорит, что что-то есть "undefined", это в основном означает, что может произойти всякое нарушение. Если вы продолжаете это делать (и ваша программа не падает), вы можете получить непоследовательные результаты. Когда говорится, что что-то определено реализацией, вы получите согласованные результаты для этой реализации.

Если вы компилируете для x86 в VC2010, то, что происходит, когда вы притворяетесь, что массив байтов представляет собой неподписанный короткий массив (т.е.: unsigned char *byteArray = ...; unsigned short *usArray = (unsigned short*)byteArray), определяется реализацией. При компиляции для процессоров большого числа, вы получите другой ответ, чем при компиляции для малоинтенсивных процессоров.

В целом, проблемы с endian - это то, что вы можете локализовать в системах ввода/вывода. Сеть, чтение файлов и т.д. Их следует позаботиться в конце вашей кодовой базы.

Ответ 2

Вопрос 1:

Может ли a.out работать в системе little-endian и big-endian?

Нет. Поскольку a.out уже скомпилирован для любой архитектуры, на которую он нацеливается. Он не будет работать на другой архитектуре, которая несовместима с.

Однако исходный код для этой простой программы не имеет ничего, что могло бы сломаться на разных конечных машинах.

Итак, да (источник) будет работать правильно. (ну... кроме void main(), который вы должны использовать вместо int main())

Вопрос 2:

Если моя система WindowsXP является малоподвижной, могу ли я установить big-endian Linux в VMWare/VirtualBox?

Endian-ness определяется аппаратным обеспечением, а не ОС. Таким образом, любая (родная) VM, которую вы устанавливаете на нем, будет иметь тот же конец, что и хост. (так как x86 все мало-endian)

Что делает систему мало-endian или big-endian?

Вот пример чего-то, что будет вести себя по-разному по сравнению с big-endian:

uint64_t a = 0x0123456789abcdefull;
uint32_t b = *(uint32_t*)&a;
printf("b is %x",b)

* Обратите внимание, что это нарушает строгое сглаживание и предназначено только для демонстрации.

Little Endian : b is 89abcdef
Big Endian    : b is 1234567

В little-endian младшие разряды a сохраняются с наименьшим адресом. Поэтому, когда вы получаете доступ к a как 32-битовое целое число, вы будете читать более низкие 32 бита. На большом конце вы будете читать верхние 32 бита.

Вопрос 3:

Если я хочу написать независимую программу на С++ без байта, что мне делать необходимо учитывать?

Просто следуйте стандартным правилам С++ и не делайте ничего уродливого, как пример, показанный выше. Избегайте поведения undefined, избегайте ввода типа...

Ответ 3

Мало-endian/big-endian - это свойство аппаратного обеспечения. В общем случае двоичный код, скомпилированный для одного оборудования, не может работать на другом оборудовании, за исключением среды виртуализации, которая интерпретирует машинный код, и эмулирует целевое оборудование для него. Существуют двухъядерные процессоры (например, ARM, IA-64), в которых есть переключатель для изменения endianness.

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

Ответ 4

Первое, что нужно прояснить, это то, что endianness - это атрибут аппаратного обеспечения, а не атрибут программного обеспечения/ОС, поэтому WinXP и Linux не являются большими или маленькими, но скорее аппаратные средства, на которых они работают, являются либо большими, либо маленький endian.

Endianness - это описание порядка, в котором байты хранятся в типе данных. Система, которая является big-endian, хранит наиболее значимое значение (прочитанное наибольшее значение), а система little-endian сначала сохраняет младший байт. Не обязательно, чтобы каждый тип данных был таким же, как другие в системе, поэтому вы можете иметь смешанные системы.

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

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

Ответ 5

1: Результат компилятора будет зависеть от параметров, которые вы ему даете, и если вы используете кросс-компилятор. По умолчанию он должен запускаться в операционной системе, на которой вы ее компилируете, а не на других (возможно, даже не на других типах, но не на всех Linux-версиях, например, на всех установках Linux). В крупных проектах это будет наименьшей из ваших проблем, так как библиотеки и т.д. Будут нуждаться в построении и привязке по-разному к каждой системе. Использование надлежащей системы сборки (например, make) позаботится об этом, не беспокоясь.

2: Виртуальные машины абстрагируют аппаратное обеспечение таким образом, чтобы в любом месте можно было что-то запускать. Как операционные системы управляют своей памятью, неважно, пока они оба работают на одном аппаратном обеспечении и поддерживают любую модель виртуализации. Endianness означает порядок байтов; если он читается влево-вправо или вправо-влево (или какой-либо другой формат). Некоторые аппаратные средства поддерживают как виртуализацию, так и сосуществование в этом случае (хотя я не знаю, как это было бы полезно, за исключением того, что это возможно в теории). Однако Linux работает на многих разных архитектурах (и Windows, отличных от Ixxx), поэтому ситуация сложнее.

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

Ответ 6

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

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