Порядок байт¶
Порядок байт (англ. endianness, от Gulliver’s Travels — «лилипуты» и «блефусканцы», спорившие, с какого конца разбивать яйцо) — это способ расположения байтов при записи числа в памяти компьютера или при передаче по сети. Определяет, в каком порядке байты многобайтового значения (например, 16-битного, 32-битного или 64-битного) следуют друг за другом: от старшего к младшему (big-endian) или от младшего к старшему (little-endian). Выбор порядка байт влияет на совместимость данных между разными архитектурами процессоров, протоколами и форматами файлов.
¶История
Понятие порядка байт возникло с развитием цифровых вычислительных машин в середине XX века. Ранние компьютеры, такие как IBM System/360 (1964 год), использовали big-endian, что упрощало чтение чисел человеком и облегчало сравнение строк. В то же время процессоры Intel 8080 (1974 год) и последующие x86-совместимые архитектуры выбрали little-endian, что упрощало арифметические операции с младшими разрядами. Термин «endianness» популяризировали Дэнни Коэн и Дон Кнут в 1980-х годах, ссылаясь на сатиру Джонатана Свифта «Путешествия Гулливера», где лилипуты и блефусканцы спорили, с какого конца разбивать варёное яйцо.
¶Классификация
¶Big-endian (старший байт первым)
В big-endian первый байт (с наименьшим адресом) содержит старшие разряды числа, а последний — младшие. Например, 32-битное число 0x12345678 в памяти будет храниться как последовательность байт: 0x12, 0x34, 0x56, 0x78. Этот порядок естественен для человека, так как соответствует привычной записи чисел слева направо. Используется в сетевых протоколах (TCP/IP, IPv4, IPv6), форматах JPEG, PNG, в архитектурах Motorola 68000, IBM POWER, SPARC, а также в некоторых процессорах ARM (в режиме big-endian).
¶Little-endian (младший байт первым)
В little-endian первый байт содержит младшие разряды, последний — старшие. То же число 0x12345678 будет храниться как 0x78, 0x56, 0x34, 0x12. Этот порядок упрощает арифметику с целыми числами, так как младший байт находится по наименьшему адресу, что ускоряет сложение и вычитание. Применяется в процессорах Intel x86, x86-64, в большинстве реализаций ARM (в режиме little-endian), в графических процессорах NVIDIA, а также в форматах файлов, таких как BMP, AVI, WAV.
¶Bi-endian (двунаправленный порядок)
Некоторые архитектуры, например ARM, PowerPC, MIPS, поддерживают переключение между big-endian и little-endian программно или аппаратно. Это позволяет адаптировать систему к требованиям конкретного приложения или протокола. Например, процессор ARM может работать в little-endian по умолчанию, но при загрузке операционной системы переключаться в big-endian для совместимости с сетевым стеком.
¶Middle-endian (смешанный порядок)
Редкий вариант, при котором байты внутри слова переставляются нелинейно. Например, 32-битное число 0x12345678 может храниться как 0x34, 0x12, 0x78, 0x56 (порядок «слово-байт»). Встречался в некоторых компьютерах, таких как PDP-11 (Digital Equipment Corporation) и VAX. В современных системах практически не используется.
¶Устройство и принцип работы
Порядок байт определяется на уровне аппаратного обеспечения процессора или на уровне программного обеспечения (например, в виртуальных машинах). При записи многобайтового числа в память процессор использует фиксированный порядок, который зависит от его архитектуры. При передаче данных между системами с разным порядком байт требуется преобразование, чтобы избежать некорректной интерпретации чисел.
¶Пример работы с 32-битным целым числом
Пусть число 0x12345678 (десятичное 305 419 896) хранится в памяти, начиная с адреса 0x1000.
- Big-endian: адрес 0x1000 — 0x12, 0x1001 — 0x34, 0x1002 — 0x56, 0x1003 — 0x78.
- Little-endian: адрес 0x1000 — 0x78, 0x1001 — 0x56, 0x1002 — 0x34, 0x1003 — 0x12.
¶Преобразование порядка байт
В программировании для преобразования используются функции, такие как htonl() (host-to-network long) и ntohl() (network-to-host long) в языке C. В современных языках высокого уровня (Python, Java, C#) существуют встроенные методы для работы с порядком байт, например struct.pack() и struct.unpack() в Python.
¶Применение
¶Сетевые протоколы
В сетевых протоколах, таких как TCP/IP, IPv4, IPv6, UDP, используется big-endian (так называемый «сетевой порядок байт»). Это обеспечивает единообразие при передаче данных между разными архитектурами. Например, IP-адрес 192.168.1.1 в 32-битном представлении (0xC0A80101) передаётся как байты 0xC0, 0xA8, 0x01, 0x01.
¶Файловые форматы
Многие форматы файлов фиксируют порядок байт. Например, JPEG и PNG используют big-endian, а BMP и WAV — little-endian. Формат TIFF поддерживает оба порядка, указывая его в заголовке файла (байт порядка 0x4949 для little-endian, 0x4D4D для big-endian).
¶Операционные системы
Операционные системы, такие как Windows (для x86-64) и Linux (на x86-64), работают в little-endian. macOS на ARM-процессорах Apple Silicon также использует little-endian. В то же время, системы на базе SPARC или POWER могут работать в big-endian.
¶Встраиваемые системы
В микроконтроллерах, таких как AVR (Arduino) и ARM Cortex-M, порядок байт может быть фиксированным или настраиваемым. Например, ARM Cortex-M по умолчанию работает в little-endian, но может быть сконфигурирован для big-endian.
¶Примеры
¶Архитектуры процессоров
- Little-endian: Intel x86, x86-64, AMD64, большинство ARM (в режиме little-endian), RISC-V (по умолчанию little-endian).
- Big-endian: IBM System/360, Motorola 68000, SPARC, PowerPC (в режиме big-endian), MIPS (в режиме big-endian).
- Bi-endian: ARM, PowerPC, MIPS, RISC-V (поддерживают переключение).
¶Форматы данных
- Big-endian: JPEG, PNG, TCP/IP, IPv4, IPv6, DNS, SSH, TLS.
- Little-endian: BMP, AVI, WAV, ELF (на x86), PE (Windows), FAT32 (на x86).
¶Проблемы и критика
¶Несовместимость данных
Основная проблема порядка байт — несовместимость данных между системами с разным endianness. Например, файл, созданный на компьютере с little-endian (Intel), может быть некорректно прочитан на системе с big-endian (SPARC) без преобразования. Это особенно актуально для сетевых протоколов и обмена данными между разными архитектурами.
¶Производительность
Преобразование порядка байт требует дополнительных вычислительных ресурсов. В системах, где данные часто передаются между разными архитектурами (например, в серверах баз данных), это может снижать производительность. Однако современные процессоры имеют аппаратные инструкции для быстрого преобразования (например, bswap в x86).
¶Путаница в программировании
Разработчики могут ошибочно предполагать порядок байт, что приводит к багам. Например, при чтении бинарного файла, созданного на другой архитектуре, без учёта endianness, числа могут быть интерпретированы неверно. Для избежания этого используются стандартные форматы (например, big-endian в сети) и явные преобразования.
¶Интересные факты
- Термин «endianness» ввёл Дэнни Коэн в 1980 году в статье «On Holy Wars and a Plea for Peace», где он сравнил спор о порядке байт с войной лилипутов и блефусканцев из «Путешествий Гулливера».
- В процессорах Intel x86 порядок байт фиксирован как little-endian, но в некоторых моделях (например, Intel Itanium) поддерживался bi-endian.
- В архитектуре ARM порядок байт может быть переключён программно, но это требует осторожности, так как не все периферийные устройства поддерживают оба режима.
- Формат UTF-16 использует маркер порядка байт (BOM) — символ U+FEFF, который позволяет определить, в каком порядке (big-endian или little-endian) записан текст.
¶Источники
- Коэн, Дэнни. «On Holy Wars and a Plea for Peace». IEEE Computer, 1981.
- Таненбаум, Эндрю. «Архитектура компьютера». 5-е издание, 2006.
- Стивенс, У. Ричард. «TCP/IP Illustrated, Volume 1: The Protocols». Addison-Wesley, 1994.
- Документация Intel 64 and IA-32 Architectures Software Developer’s Manual.
- Спецификация ARM Architecture Reference Manual.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


