最終更新日時: 2026年04月06日 11時49分40秒 (JST)
Akira Takahashi が更新

履歴 編集

enum
<bit>

# std::endian(C++20)

    namespace std {
      enum class endian {
        little = 以下参照,
        big = 以下参照,
        native = 以下参照
      };
    }

## 概要

バイトの並び順 (エンディアン) を表す列挙型。

複数バイトのスカラ型データの並び順として、実行環境には「ビッグエンディアン (big endian)」と「リトルエンディアン (little endian)」という2つの選択肢がある。ビッグエンディアンは上位ビットから下位ビットに向けて並び、リトルエンディアンは下位ビットから上位ビットに向けて並ぶ。

エンディアンはシステムによって異なるため、システム間でエンディアンの変換が必要になる場合がある。そういったときのために、この列挙型を使用できる。

各列挙値は、以下を意味する：

列挙値 | 説明
--- | ---
`little` | リトルエンディアン
`big` | ビッグエンディアン
`native` | 実行環境のエンディアン。`little`か`big`か、またはそのどちらでもない値を持つ

全てのスカラ型のサイズが1である場合、バイト順に意味はないため`little`、`big`、`native`は同じ値を持つ。そうでなければ、`little`と`big`は異なる値を持つ。

全てのスカラ型がビッグエンディアンである場合、`native == big`。全てのスカラ型がリトルエンディアンである場合、`native == little`。そのどちらでもなければ、`native`は`big`でも`little`でもない値となる (mixed endian、PDPエンディアン、ミドルエンディアンなどと呼ばれるエンディアン方式)。

## 例

    #include <bit>
    #include <iostream>

    int main()
    {
      if (std::endian::native == std::endian::little) {
        std::cout << "実行環境はリトルエンディアンを使用する" << std::endl;
      }
      else if (std::endian::native == std::endian::big) {
        std::cout << "実行環境はビッグエンディアンを使用する" << std::endl;
      }
      else {
        std::cout << "実行環境はリトルでもビッグでもないエンディアンを使用する" << std::endl;
      }
    }

### 出力例

    実行環境はリトルエンディアンを使用する

## バージョン

### 言語

- C++20

### 処理系

- Clang:
- GCC:
- Visual C++: ??

## 関連項目

- `__STDC_ENDIAN_BIG__`, `__STDC_ENDIAN_LITTLE__`, `__STDC_ENDIAN_NATIVE__` - C互換のエンディアン定数

## 参照

- P0463R1 endian, Just endian
- P1612R1 Relocate Endian's Specification