エンディアンについて
例えばH8用のCプログラムの一部をWindowsで動作させたいとする。
H8はビッグエンディアン、Intel CPUはリトルエンディアンなので
外部のバイナリファイルを読み込むときなどに問題になる。
sample1.c
UB ReadFile[100]; //外部のバイナリファイルを読んで1バイトずつ格納するための配列
typedef struct test{
UH Code; // コード(2byte)
UB yobi[14]; // 予備
}TEST;
TEST *file_ptr;
//(中略:ReadFileに外部のバイナリファイルを1バイトずつ格納する処理)
file_ptr = (TEST*)&ReadFile[0];
ReadFileの値が以下であったとする。
ReadFile[0]=0x01
ReadFile[1]=0x02
このとき、**"file_ptr->Code"**の値は以下のようになる。
H8 | Intel |
---|---|
0x0102 | 0x0201 |
sample2.c
UH code; //2バイト
UB *ptr;
ptr = (UB*)&code;
*ptr = 0x01;
ptr++;
*ptr = 0x02;
このときも、**"code"**の値は以下のようになる。
H8 | Intel |
---|---|
0x0102 | 0x0201 |
ビットフィールド
実は共用体のビット定義も逆になっている。
sample3.c
typedef union {
UH data; //2バイト
struct {
UH bf1:7;
UH bf2:5;
UH bf3:4;
} bit;
} BIT_TEST1;
sample3.cはCPUによって先頭メンバのビットフィールドが逆順になる。
H8 | ||
---|---|---|
bf1 :7bit | bf2 :5bit | bf3 :4bit |
bit15~9 | bit8~4 | bit3~0 |
Intel | ||
---|---|---|
bf3 :4bit | bf2 :5bit | bf1 :7bit |
bit15~12 | bit11~7 | bit6~0 |
ただし先頭メンバが配列のときは、配列の要素ごとにビットフィールドが逆になる。
sample4.c
typedef union {
UB data[2]; //1byte×2の配列
struct {
UB bf1:4;
UB bf2:4;
UB bf3:4;
UB bf4:4;
} bit;
} BIT_TEST2;
H8 | |||
---|---|---|---|
data[0] | data[1] | ||
bf1 :4bit | bf2 :4bit | bf3 :4bit | bf4 :4bit |
bit7~4 | bit3~0 | bit7~4 | bit3~0 |
Intel | |||
---|---|---|---|
data[0] | data[1] | ||
bf2 :4bit | bf1 :4bit | bf4 :4bit | bf3 :4bit |
bit7~4 | bit3~0 | bit7~4 | bit3~0 |