DX・デジタルトランスフォーメーション

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版

ブロックチェーン・暗号技術 | android | iOS | Web | アプリの著作権 | 日本のなりたち | 禅・大乗仏教 | 新しい社会

エンディアン性(Big EndianとLittle Endian)の違い、そしてバイトオーダーとビットオーダーについて理解しよう。

エンディアン性(Big EndianとLittle Endian)の違い、そしてバイトオーダーとビットオーダーについて理解しよう。

C言語を使う人以外は、バイトオーダーを気にする必要はない。

でも気になるというプログラマーはこのページを見れば、完全に理解できるだろう。

どうして、バイトオーダーを取り決める必要があるのかというと、

ヒープやスタックのメモリーアドレスはワード(int, 64bit)ごとに振られているし、レジスタはワードサイズだし、ネットワークはシリアル回線だ。

だから、一つのアドレスにデータを格納するには、どのバイトから保存したらいいのか?やネットワークにデータを流すにはどのビットから先に流せばいいのか?という問題が出てくる。

最近のSoCsチップは、バイトオーダーをUEFIやOSが自由に切り替えられるようになっている。

イーサネットでは、バイトオーダーはBig EndianでビットオーダーはLittle Endianだ。

下に実際の例を挙げておく。

一つのメモリーアドレスには8バイトのデータが格納できる。

データ「1 (int)」を変数に格納すると、

0x0000000000000001

とヒープやスタックに物理的に保存するSoCsと

0x0100000000000000

とヒープやスタックに物理的に保存するSoCsがある。

上がBig Endian、下がLittle Endian。

Endian(たまごを食べる方向)とは、2進数としての最上位桁から順に保存するのがBig Endian。

2進数としての最下位桁から順に保存するのがLittle Endian。

0x1234567890 でいうと、

最上位桁とは、

0x12 0b00010010

最下位桁とは、

0x90 0b10010000

なので、

Little Endianだと、

0x9078563412 とメモリー保存される。

例えば、下記の num.number に 1 を代入すると、
union {
  int number;
  char bytes[8];
} num;
bytes[0] が 1 となるのが、Little Endian。
bytes[7] が 1 となるのが、Big Endianである。
*union とは、メンバー変数(number、bytes)がヒープメモリー内の同じアドレスに配置される構造体だ。
 

通常は、バイトオーダー(Byteの並び)とビットオーダー(Bitの並び)は同じとなる。

バイトオーダーがBig EndianならビットオーダーもBig Endianとなるのだ。(詳細は下記。)

・バイトオーダー&ビットオーダーの種類

メモリーアドレス

0xABABF082DCABF082

人が見るデータ表現

あいAB (utf-8)

Hex

0xE38182 0xE38183 0x41 0x42

<メモリ、レジスタ、イーサネットの内部表現例>

Memory Byte Order: Big Endian (Bit Order: Big Endian)

Binary

0b11100011 10000001 10000010 0b11100011 10000001 10000011 0b01000001 0b01000010

*上位ビットから下位ビットに向かって物理メモリに格納する。

*ビットもバイトも同じオーダーとなる。

Ethernet (USB) Byte Order: Big Endian (Bit Order: Little Endian)

Binary

0b11000111 10000001 01000001 0b11000111 10000001 11000001 0b10000010 0b01000010

*上位バイトから下位バイトに向かって物理メモリに格納する。

*バイト内のビットは下位ビットから上位ビットに向かって物理メモリに格納する。(Little Endianとなる。)

*ビットオーダーはドライバーソフトウェアが吸収するためアプリケーションでは考慮しなくて良い。

Memory Byte Order: Little Endian (Bit Order: Little Endian)

Binary

0b01000001 10000001 11000111 0b11000001 10000001 11000111 0b10000010 0b01000010

*下位ビットから上位ビットに向かって物理メモリに格納する。

*ビットもバイトも同じオーダーとなる。

Q1)

バイトオーダーは何が決めているのか?

SoCsチップ(ARM, Apple, Intel)とUEFIとOS(macOS、Windows10、Ubuntu)

Q2)

バイトオーダーとビットオーダーは何が違うのか?

バイトオーダーは、ワード内のバイトの並べ方。

ビットオーダーは、バイト内のビットの並べ方。

// 判定コード
union {
  int number;
  char bytes[8];
} num;
num.number = 1;
if num.bytes[0] == 1
  echo 'Little Endian';  //0x0100000000000000
else
  echo 'Big Endian';  //0x0000000000000001

2023年12月
     12
3456789
10111213141516
17181920212223
24252627282930
31      
android
iOS
web
アプリの著作権
ブロックチェーン/暗号技術
新しい社会
禅・大乗仏教
日本のなりたち

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版
デジタルトランスフォーメーションで新しい生活を提案!