一般的なCPUでは、メモリをバイト単位で扱うことができます。そのため、メモリのアドレスはバイト単位で割り振られています。バイト単位でメモリに割り当てている限り、CPUによる1バイト単位のアクセスは問題ありません。
2バイト以上のデータをメモリに置く場合、並びの順番が様々あります。C言語でいうと、1バイトだとchar, 2バイトだとshort int, 4バイトだとint, 8バイトだとdoubleなど複数バイトのデータが扱えます。
2バイトのデータだと、2! = 2通りの並べ方があって、4バイトだと4!=12通り、8バイトだと8!通りの並べ方があります。このように複数バイト列を一つのまとまりとして扱う場合、バイト列の並びが複数通り存在することがわかります。
このようなバイト列の並びの規則をバイトオーダ、あるいはエンディアンと呼びます。
並び方は複数考えられますが、不規則な並びを取る必要がないので、基本的には以下の2つが使用されます。
- ビッグエンディアン
- 小さい桁から順番に一番大きいアドレスに並べる
- リトルエンディアン
- 大きい桁から順番に一番小さいアドレスに並べる
エンディアンはCPUのアーキテクチャによって異なるため、注意が必要です。特にバイナリファイルなどのやり取りをする場合はエンディアンに気をつけてプログラミングしないと、期待と異なる結果が得られることがあるので注意しましょう。
ビッグエンディアン
一番小さい桁を一番大きいアドレスに割り当てる方式をビッグエンディアンと呼びます。
4バイトの値0x12345678をビッグエンディアンでメモリに割り当てる例を見てみます。
一番小さい桁は0x78です。これを一番大きいアドレスである、3番地に割り当てています。これがビッグエンディアンです。
リトルエンディアン
一番小さい桁を一番小さいアドレスに割り当てる方式をリトルエンディアンと呼びます。
4バイトの値0x12345678をリトルエンディアンでメモリに割り当てる例を見てみます。
一番小さい桁は0x78です。これを一番小さいアドレスである、0番地に割り当てています。これがリトルエンディアンです。
まとめ
本記事では、複数バイトをひとまとまりのデータとして扱う場合のバイト列の並び方、エンディアンについて解説しました。ビッグエンディアンとリトルエンディアンがアーキテクチャによって異なるので、注意しましょう。
コメント