プロジェクト

全般

プロフィール

ビッグエンディアンとリトルエンディアン

はじめに

コンピュータ(CPU)が、メモリをバイト(8bit)単位でアドレスを付けてアクセスすることにして以来、8bitを越えるデータ(整数、浮動小数点数)をどの順番でメモリに配置するかで2つの流派が登場しました。ビッグエンディアン(big endian)とリトルエンディアン(little endian)です。

図解

リトルエンディアンの流派が32bit整数データをメモリに配置する場合

                   MSB         LSB
                    +--+--+--+--+
  32bitレジスタに   |12|34|56|78|     メモリ
  格納されている値  +--+--+--+--+      |  |
                      |  |  |  |       |  |  アドレス
                      |  |  |  +------>|78|  a
                      |  |  +--------->|56|  a + 1
                      |  +------------>|34|  a + 2
                      +--------------->|12|  a + 3
                                       |  |

ビッグエンディアンの流派が32bit整数データをメモリに配置する場合

                  MSB         LSB
                   +--+--+--+--+
         メモリ    |12|34|56|78|  32bitレジスタに格納されている値     
          |  |     +--+--+--+--+
アドレス  |  |      |  |  |  |
   a      |12|<-----+  |  |  |
   a + 1  |34|<--------+  |  |
   a + 2  |56|<-----------+  |
   a + 3  |78|<--------------+
          |  |

データ交換で困ること

リトルエンディアン同士、あるいはビッグエンディアン同士でメモリの内容を交換する場合は、8bitを超えるデータを正しく解釈することができますが、リトルエンディアンとビッグエンディアンの間でメモリの内容を交換する場合は、メモリの内容を正しく解釈するためにはどちらかがバイト順番を並び替える必要があります。

そこで、メモリ、ファイル、ネットワークなどを介してデータ交換する場合、データを並べた順番がリトルエンディアンかビッグエンディアンかをあらかじめ取り決めておき、その順番でデータを配置するのが一般的な方法です。取り決めにはデータの先頭にエンディアンがどちらかを示す情報を格納する方法もあります。インターネットでは「ネットワークバイトオーダー(ビッグエンディアン)」とすることが多いです。

トピック

リトルエンディアンにおけるビットフィールドの解釈

例えば次のようなデータ構造を設けたとします。

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LI|  VN | MODE|    Stratum    |     Poll      |   Precisoin   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

これを、32bit整数で左端をMSB、右端をLSBとして割り付けると

MSB 31                                                             0 LSB
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | LI|  VN | MODE|    Stratum    |     Poll      |   Precisoin   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

リトルエンディアンでは、

アドレス     メモリ                     アドレス |       a       |      a + 1    |     a + 2     |     a + 3     | 
             |               |                        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+             
             +-+-+-+-+-+-+-+-+                        |   Precison    |     Poll      |    Stratum    | LI|  VN | MODE|
   a         |   Precision   |                        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             +-+-+-+-+-+-+-+-+
   a + 1     |      Poll     |
             +-+-+-+-+-+-+-+-+
   a + 2     |    Stratum    |
             +-+-+-+-+-+-+-+-+
   a + 3     | LI|  VN | MODE|
             +-+-+-+-+-+-+-+-+
             |               |

と格納されます。

なんか、設計とイメージが一致しないので不可思議な感じがします。
実装時に注意しないと間違い(バグ)につながると思われます。
ネットワークバイトオーダーがビッグエンディアンというのは間違いの削減において効果があると思います。

ビットへの番号付け

プログラミング言語では、ビット番号としてLSBを0とした順序付けをよく見かけます。上述の図でもLSBを0として番号付けをしています。

MSB  7             0 LSB
    +-+-+-+-+-+-+-+-+
    |1|0|1|0|0|1|1|0|
    +-+-+-+-+-+-+-+-+

一方、TCP/IPなどのインターネットプロトコルでは、MSBを0とした順序付けを見かけます。

MSB  0             7 LSB
    +-+-+-+-+-+-+-+-+
    |1|0|1|0|0|1|1|0|
    +-+-+-+-+-+-+-+-+

これは流儀なのでどちらが正解というわけではありませんが、気にしておくとよい事項です。


ほぼ11年前に更新