Spec-Zone.ru › C++

std::endian

Определено в заголовочном файле <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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/endian

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API