Последнее обновление: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:
- little-endian
В зависимости от архитектуры разные системы могут иметь порядок байтов хоста 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;
}
}
Похожие темы¶
- Введение в корутины C++20 | C++那些事
- Практика с channel в C++20 | C++那些事
- Концепции Concepts в C++20 | C++那些事
- constexpr и оператор «запятая» в C++20 | C++那些事
- Лямбда-выражения в C++20 (часть 1) | C++那些事
- Модули Modules в C++20 | C++那些事
- Библиотека Ranges в C++20 | C++那些事
- Дизайн и подводные камни std::span в C++20 | C++那些事
- Обзор новых возможностей C++20 | C++那些事
- [[likely]] и [[unlikely]] в C++20 | C++那些事