Назад к вопросам
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;
}