Namespaces
Variants

std:: endian

From cppreference.net
Utilities library
Определено в заголовочном файле <bit>
enum class endian

{
little = /* implementation-defined */ ,
big = /* implementation-defined */ ,
native = /* implementation-defined */ ,

} ;
(начиная с C++20)

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

  • Если все скалярные типы имеют порядок байтов little-endian, std :: endian :: native равен std :: endian :: little .
  • Если все скалярные типы имеют порядок байтов big-endian, 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