Big-endian
Big-endian (от англ. big — «большой» и end — «конец») — это способ записи многобайтовых или многословных данных в памяти компьютера или при передаче по сети, при котором старший (наиболее значимый) байт (или слово) располагается по наименьшему адресу или передаётся первым. Противоположным способом является little-endian, при котором первым идёт младший байт.
Происхождение термина
Термины «big-endian» и «little-endian» были введены в 1980 году Дэнни Коэном в статье «On Holy Wars and a Plea for Peace» («О священных войнах и призыве к миру»), опубликованной в журнале Computer Architecture News. Коэн использовал аллюзию на роман Джонатана Свифта «Путешествия Гулливера», где в стране лилипутов разгорелся конфликт между «остроконечниками» и «тупоконечниками» по вопросу, с какого конца разбивать варёное яйцо. В контексте вычислительной техники «big-endian» означает, что «большой конец» (старший байт) числа хранится первым.
Принцип работы
В компьютерной архитектуре данные хранятся в виде последовательности байтов. При работе с числами, размер которых превышает один байт (например, 16-битные, 32-битные или 64-битные), возникает вопрос о порядке следования байтов в памяти.
Пример для 32-битного целого числа
Рассмотрим 32-битное целое число 0x12345678 (в шестнадцатеричной системе). Оно состоит из четырёх байтов: 0x12 (старший), 0x34, 0x56, 0x78 (младший).
- Big-endian: В памяти по возрастанию адресов байты располагаются в порядке от старшего к младшему:
- Адрес
A:0x12 - Адрес
A+1:0x34 - Адрес
A+2:0x56 - Адрес
A+3:0x78 - Little-endian: В памяти по возрастанию адресов байты располагаются в обратном порядке — от младшего к старшему:
- Адрес
A:0x78 - Адрес
A+1:0x56 - Адрес
A+2:0x34 - Адрес
A+3:0x12
Таким образом, при big-endian порядок байтов в памяти совпадает с порядком, в котором число записывается в тексте (слева направо от старшего к младшему), что упрощает визуальное восприятие.
История и применение
Сетевой порядок байтов
В протоколах TCP/IP (Интернет) для передачи данных по сети используется big-endian, который в этом контексте называется сетевым порядком байтов (network byte order). Это было закреплено в стандартах RFC 791 и RFC 793. Причина выбора big-endian связана с историческим доминированием архитектур, использующих этот порядок, в ранних сетевых устройствах и рабочих станциях.
Архитектуры процессоров
- Big-endian: Исторически использовался в процессорах Motorola 68000, IBM POWER, Sun SPARC, а также в некоторых моделях ARM (до ARMv3) и MIPS (настраиваемый режим). В настоящее время big-endian применяется в основном в специализированных системах, например, в некоторых микроконтроллерах и встраиваемых устройствах.
- Little-endian: Стал доминирующим благодаря архитектуре x86 (Intel, AMD) и её производным. Также используется в большинстве современных процессоров ARM (по умолчанию), RISC-V и PowerPC (в режиме little-endian).
Файловые форматы и протоколы
Некоторые форматы данных и протоколы явно указывают порядок байтов. Например:
- JPEG и PNG используют big-endian для заголовков и метаданных.
- GIF использует little-endian.
- ELF (Executable and Linkable Format) поддерживает оба порядка, определяя его в заголовке файла.
- UTF-16 и UTF-32 могут использовать как big-endian, так и little-endian, что обозначается меткой порядка байтов (BOM) в начале файла.
Преимущества и недостатки
Преимущества big-endian
- Читаемость: При отладке или анализе дампов памяти big-endian-данные легче интерпретировать человеку, так как порядок байтов совпадает с естественным порядком записи чисел.
- Совместимость с сетевыми протоколами: Многие сетевые протоколы (TCP/IP) требуют big-endian, что упрощает реализацию сетевого стека на архитектурах, использующих этот порядок.
- Сравнение строк: При сравнении строк, хранящихся в big-endian, можно использовать побайтовое сравнение, так как старший байт определяет результат.
Недостатки big-endian
- Сложность преобразования: При обмене данными между системами с разным порядком байтов требуется преобразование, что увеличивает вычислительные затраты.
- Неэффективность для некоторых операций: В архитектурах, где big-endian не является родным, операции с многобайтовыми данными (например, сдвиги, маскирование) могут быть менее эффективными по сравнению с little-endian.
Сравнение с little-endian
| Характеристика | Big-endian | Little-endian |
|---|---|---|
| Порядок байтов в памяти | Старший байт по младшему адресу | Младший байт по младшему адресу |
| Визуальное восприятие | Естественное для человека | Инвертированное |
| Сетевой порядок | Используется в TCP/IP | Не используется |
| Доминирующие архитектуры | Motorola, SPARC, IBM POWER | x86, ARM (по умолчанию), RISC-V |
| Преобразование при передаче | Требуется для little-endian машин | Требуется для big-endian машин |
Интересные факты
- В архитектуре x86 (Intel, AMD) используется исключительно little-endian, что стало причиной того, что большинство современных компьютеров и серверов работают в этом режиме.
- Процессоры ARM поддерживают оба порядка, но по умолчанию работают в little-endian. В ранних версиях ARM (до ARMv3) был предусмотрен только big-endian.
- В некоторых системах, например, в PowerPC, порядок байтов может быть переключён программно, что позволяет запускать приложения, написанные для разных архитектур.
- Термин «endianness» (порядок байтов) используется не только для байтов, но и для более крупных единиц данных, например, для слов или двойных слов.
Источники
- Коэн, Дэнни. «On Holy Wars and a Plea for Peace». Computer Architecture News, 1980.
- RFC 791 — Internet Protocol, 1981.
- RFC 793 — Transmission Control Protocol, 1981.
- Таненбаум, Эндрю. «Архитектура компьютера». 6-е издание, 2013.
- Хеннесси, Джон Л., Паттерсон, Дэвид А. «Компьютерная архитектура: количественный подход». 5-е издание, 2012.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →