Перейти к содержанию

Последнее обновление:2026-10-12

Порядок байтов endian в C++20

На собеседованиях порядок байтов обычно является очень важной темой, где проверяют:

  • Понятие big-endian и little-endian
  • Как определить порядок байтов
  • Порядок байтов хоста
  • Сетевой порядок байтов
  • и так далее

— а способов определения на самом деле очень много, например:

  • endian из C++20
  • union
  • преобразование адресов
  • htons

В этом разделе мы разберём использование и базовые знания о порядке байтов в C++20.

Примечание: для ленивых — исходный код с 4 способами определения порядка байтов уже выложен в сообществе (知识星球), забирайте, если интересно.

1.Основы порядка байтов

Порядок байтов системы — это порядок, в котором байты хранятся в памяти или передаются по сети. Системы big-endian хранят самый старший байт (MSB) по наименьшему адресу памяти. Этот порядок используется в различных сетевых протоколах для отправки данных по сети и называется сетевым порядком байтов. В системах little-endian самый младший байт (LSB) хранится по наименьшему адресу памяти. Например, шестнадцатеричное число 0x12345678 хранится следующим образом:

  • big-endian:
地址     | 值

n       | 0x12
n + 1   | 0x34
n + 2   | 0x56
n + 3   | 0x78
  • little-endian
地址    | 值

n       | 0x78
n + 1   | 0x56
n + 2   | 0x34
n + 3   | 0x12

В зависимости от архитектуры разные системы могут иметь порядок байтов хоста big-endian или little-endian.

2.Важность порядка байтов

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

3.Проверка порядка байтов

C++20 ввёл более простой и переносимый способ проверки порядка байтов — std::endian. Вы можете использовать std::endian::native для проверки порядка байтов хоста системы. Вот простой пример:

void checkEndianness() {
  if constexpr (std::endian::native == std::endian::little) {
    std::cout << "小端" << std::endl;
  } else if constexpr (std::endian::native == std::endian::big) {
    std::cout << "大端" << std::endl;
  } else {
    std::cout << "未知" << std::endl;
  }
}

Похожие темы

Комментарии