Namespaces
Variants

std::endian

От ru.cppreference.net
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (основные типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Типы общей лексики
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Определён в заголовке <bit>
enum class endian
{
    little = /* implementation-defined */,
    big    = /* implementation-defined */,
    native = /* implementation-defined */,
};
(since C++20)

Указывает порядок байтов для всех скалярных типов:

  • Если все скалярные типы имеют порядок от младшего к старшему, std::endian::native равно std::endian::little.
  • Если все скалярные типы имеют порядок от старшего к младшему, std::endian::native равно std::endian::big.

Также поддерживаются платформы с особыми случаями:

  • Если все скалярные типы имеют sizeof равным 1, порядок байтов не имеет значения, и все три значения — std::endian::little, std::endian::big и std::endian::native — совпадают.
  • Если платформа использует смешанный порядок байтов, std::endian::native не равен ни std::endian::big, ни std::endian::little.

Возможная реализация

enum class endian
{
#if defined(_MSC_VER) && !defined(__clang__)
    little = 0,
    big    = 1,
    native = little
#else
    little = __ORDER_LITTLE_ENDIAN__,
    big    = __ORDER_BIG_ENDIAN__,
    native = __BYTE_ORDER__
#endif
};

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_endian 201907L (C++20) std :: endian

Пример

#include <bit>
#include <iostream>
int main()
{
    if constexpr (std::endian::native == std::endian::big)
        std::cout << "big-endian\n";
    else if constexpr (std::endian::native == std::endian::little)
        std::cout << "little-endian\n";
    else
        std::cout << "mixed-endian\n";
}

Возможный вывод:

mixed-endian

Смотрите также

(C++23)
обращает порядок байтов в заданном целочисленном значении
(шаблон функции)
C documentation для endian