Big-endian vs Little-endian

 

Big-endian vs Little-endianって?

ビッグエンディアンとリトルエンディアンという単語は、ジョナサン・スウィフトの風刺小説『ガリヴァー旅行記』の中のエピソードに由来する。ガリバー旅行記の第1部「小人国」では、卵を丸い方(大きい方)の端から割る人々 (英: Big Endians) と尖った方(小さい方)の端から割る人々 (Little Endians) との対立が描かれている。

image vs image

ちっぽけなことで喧嘩していた「小人国」たち。でも今の政治もそうではないのかな?(日本も韓国も)

話に戻ってコンピュータの世界では「CPUがメモリにデータを保存する時、どの順番で保存するのか」の定義により「ビッグエンディアンとリトルエンディアン」に単語で分かれる

「どの順番に保存するかによる」っていう文章だけだとちっぽけなことかもしれないが、メモリ分析を正確にするために欠かせない内容である

これから二つの違いについて説明しましょう

Big Endian

データの上位バイトからメモリに並べる方式

12 34 56 78だとそのまま12 34 56 78でメモリに入れるので人間が読みやすい(デバッグしやすい)

この方式の良いところは、初めてのバイトだけ取得して数値の比較ができるため速度が速い

12 34 56 78 vs 09 97 56 76を比べるとしたら初めてのバイトである「1」と「0」だけ比べれば12 34 56 78が多いというのがわかるからね!なるほど(桁数が一致するという前提でね)

image

Little Endian

データの下位バイトからメモリに並べる方式

12 34 56 78だと 78 56 34 12になるので人間が読む順と逆(あれ?って思うね)

Little Endianは奇数か偶数かという判別をする時にBig Endianより早いという長所がある

また、演算する時もBig Endianより速い

理由としてはCPUの中で演算を行うALUが下位から上位の順でメモリを読み込むので同じ方式にした方がきっと早いだろう

またポイントの値を参照する時に有利

image

ベンダーことのByte Orderingが違う

言い忘れましたが、ビッグエンディアンとリトルエンディアンのようにバイトを保存する順番のことをByte Orderingとも呼ぶ

もし違うByte Orderingを使ってる二つのPCがネットワーク通信をしようとするとByte Orderingを統一させる作業必要

その例としてはhtons(),htonl()inet_addr()関数が使われる。

後TCP/IPの標準はBig Endianである

CPUベンダーごとに使ってるByte Orderingは以下の通り

image

X86はLittle Endianか、、つまりほとんどのIntelデスクトップはLittle Endianであること

htonl,htons関数の使用例

以下のようなプログラムを作って実行してみた

vim testmemory.c
#include <stdio.h>
#include <netinet/in.h>

int main(int argc, char **argv)
{
        int data = 1234;
        int data2 = 123456789;
        int data3;

        printf("%04x\n", data);
        printf("%04x\n", data2);
        printf("network byte order 2byte: 0x%04x\n", htons(data));
        printf("network byte order 4byte: 0x%08x\n", htonl(data2));

        return 0;
}

結果:

gcc testmemory.c
./a.out
04d2
75bcd15
network byte order 2byte: 0xd204
network byte order 4byte: 0x15cd5b07

保存されているデータの位置が4byte基準で逆になっていることがわかる

7 5b cd 15 -> 15 cd 5b 07

7に0がついてるのは16進数にした時点で0を省略していたからです。

参考したページ:

http://firejune.com/1790/%EB%B9%85%EC%97%94%EB%94%94%EC%95%88%EA%B3%BC+%EB%A6%AC%ED%8B%80%EC%97%94%EB%94%94%EC%95%88+%EA%B0%9C%EB%85%90

http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/endian

http://shinluckyarchive.tistory.com/284

http://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/PDF_Files/11.pdf

http://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8

http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3

https://www.uquest.co.jp/embedded/learning/lecture08.html

カテゴリー: math

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です