Назад к вопросам
Junior
176
questionbank
Что ты можешь рассказать о little-endian и big-endian?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Базово: little-endian — младший байт вначале, big-endian — старший байт вначале.
Пример представления 4-байтового числа 0x12345678 в памяти:
| Адрес | little-endian | big-endian |
|---|---|---|
addr |
0x78 |
0x12 |
addr + 1 |
0x56 |
0x34 |
addr + 2 |
0x34 |
0x56 |
addr + 3 |
0x12 |
0x78 |
- little-endian: Младший значащий байт (0x78) хранится по наименьшему адресу.
- big-endian: Старший значащий байт (0x12) хранится по наименьшему адресу.
Проверить endianness системы:
#include <iostream>
int main() {
unsigned int x = 1;
// Привести указатель на int к указателю на char
char *c = (char*)&x;
// Если первый байт равен 1, то это little-endian
if (*c) {
std::cout << "little-endian" << std::endl;
} else {
std::cout << "big-endian" << std::endl;
}
return 0;
}
Большинство современных процессоров (например, x86) используют little-endian. Сетевые протоколы (например, IP) часто используют big-endian (сетевой порядок байтов). Возможны проблемы при обмене данными между системами с разным порядком байтов. Для решения этой проблемы используются функции преобразования порядка байтов (например, htonl, ntohl).
#include <arpa/inet.h> // Для netinet/in.h и arpa/inet.h на POSIX
// Преобразование из порядка хоста в сетевой порядок
uint32_t host_to_net_long = htonl(0x12345678);
uint16_t host_to_net_short = htons(0x1234);
// Преобразование из сетевого порядка в порядок хоста
uint32_t net_to_host_long = ntohl(host_to_net_long);
uint16_t net_to_host_short = ntohs(host_to_net_short);
В C++20 добавлена поддержка std::endian.
#include <iostream>
#include <cstdint>
#include <bit> // C++20
int main() {
if constexpr (std::endian::native == std::endian::little) {
std::cout << "Система использует little-endian" << std::endl;
} else if constexpr (std::endian::native == std::endian::big) {
std::cout << "Система использует big-endian" << std::endl;
} else {
std::cout << "Система использует mixed-endian" << std::endl;
}
std::cout << "Платформа: ";
if (std::endian::native == std::endian::little) {
std::cout << "little-endian" << std::endl;
} else if (std::endian::native == std::endian::big) {
std::cout << "big-endian" << std::endl;
} else {
std::cout << "mixed-endian" << std::endl;
}
return 0;
}