ホストバイト順



ほとんどのマシンでは、マルチバイトオブジェクトは連続したバイトシーケンスとして格納され、オブジェクトのアドレスは使用されるバイトシーケンスの中で最も小さいアドレスである.1つのオブジェクトを表すバイトシーケンスのソートには、大端法と小端法の2つのルールがあります.
最低有効バイトが先頭にある方式はリトルエンド法(little endian)と呼ばれ、以前のDigital Equipment社の機械やIntelの機械の多くがこのような規則を採用している.最高有効バイトが先頭にある方式をビッグエンド法(big endian)と呼び,IBM,Motorola,Sun Microsystemsの多くの機器でこの規則が採用されている.
 
LE little-endianが最も人間の思考に合致するバイト順アドレス低位記憶値の低位アドレス高位記憶値の高位はどのように人間の思考に最も合致するバイト順と言えるかは、人間の第一観から言えば低位値が小さいため、メモリアドレスが小さい場所、すなわちメモリアドレス低位の逆に置くべきである.上位値はメモリアドレスの大きい場所、すなわちメモリアドレスの上位に置くべきです
 
BE big-endianの最も直感的なバイト順アドレス低位記憶値の高位アドレス高位記憶値の低位はなぜ直感的なのか、対応関係を考慮せずにメモリアドレスを左から右に低から高の順に書き出し、値を通常の高位から低位の順に書き出して両者の対照を書くだけで、1バイトずつ入力
一例として、変数xのタイプがintであり、アドレス0 x 0100に位置し、16進数値が0 x 01234567であると仮定する.アドレス範囲0 x 100~0 x 103のバイト順はマシンのタイプに依存する:アドレス:0 x 0101 0 x 0102 0 x 0103大端法:01 23 45小端法:67 45 23 01
 
次は、マシンが大端か小端かをテストするコードです.
 
#include <stdio.h>
#include <stdlib.h>
int main()   
{   
    union{   
        short s;   
        char c[sizeof(short)];   
    } un;   
    un.s = 0x0102;   
       
    if(sizeof(short) == 2)   
    {   
        if(un.c[0] == 1 && un.c[1] == 2)   
            printf("big endian
"); else if(un.c[0] == 2 && un.c[1] == 1) printf("little endian
"); else printf("unknown
"); } else { printf("sizeof(short): %d
", sizeof(short)); } system("pause"); return 0; }
上のコードはunionの特性(その変数はメモリアドレス空間を共有する)を利用しています.