コンテンツにスキップ

最終更新:2026-10-12

C++20 バイトオーダー endian

面接ではバイトオーダーは非常に重要なポイントで、次のようなことが問われます:

  • ビッグエンディアン/リトルエンディアンの概念
  • エンディアンの判別方法
  • ホストバイトオーダー
  • ネットワークバイトオーダー
  • など

判別方法は実はたくさんあります。例えば:

  • C++20 の endian
  • union
  • アドレス変換
  • htons

本節では、C++20 でのエンディアンの使い方と基礎知識を解説します。

注:お手軽版として、4通りのエンディアン判別のソースコードは星球(ナレッジプラネット)に置いてあります。興味があれば入手してください。

1.バイトオーダーの基礎

システムのバイトオーダーとは、バイトがメモリに格納されたりネットワークで転送されたりする順序を指します。ビッグエンディアンシステムでは、最下位メモリアドレスに最上位バイト(MSB)が格納されます。これは各種ネットワークプロトコルでデータ送信に使われ、ネットワークバイトオーダーとも呼ばれます。リトルエンディアンシステムでは、最下位バイト(LSB)が最下位メモリアドレスに格納されます。例えば、16進数 0x12345678 の格納方法は次の通りです:

  • ビッグエンディアン:
地址     | 值

n       | 0x12
n + 1   | 0x34
n + 2   | 0x56
n + 3   | 0x78
  • リトルエンディアン
地址    | 值

n       | 0x78
n + 1   | 0x56
n + 2   | 0x34
n + 3   | 0x12

アーキテクチャによって、システムのホストバイトオーダーはビッグエンディアンの場合もリトルエンディアンの場合もあります。

2.バイトオーダーが重要な理由

では、なぜこれが重要なのでしょうか?ネットワーク経由でデータを送信する必要がある場合、ネットワークバイトオーダーで送信されることを保証しなければなりません。多くの場合、ホストバイトオーダーはリトルエンディアンなので、データを送信する前にバイトの順序を反転する必要があります。

3.バイトオーダーのチェック

C++20 では、std::endian というよりシンプルで移植性の高い方法でバイトオーダーをチェックできるようになりました。std::endian::native を使ってシステムのホストバイトオーダーをチェックできます。簡単な例を以下に示します:

void checkEndianness() {
  if constexpr (std::endian::native == std::endian::little) {
    std::cout << "小端" << std::endl;
  } else if constexpr (std::endian::native == std::endian::big) {
    std::cout << "大端" << std::endl;
  } else {
    std::cout << "未知" << std::endl;
  }
}

関連トピック

コメント