kagamihogeの日記

kagamihogeの日記です。

unionに驚く

昨日、UNIONすげーって書いたが、ホントキモいというか感動的というか。その辺の感想。

unionはこんな感じに定義する。ちなみにchar=1バイト、short=2バイト、long=4バイトを想定。

typedef union {
unsigned char char_data[4];
unsigned short short_data[2];
unsigned long long_data;
}HOGE_DATA;

こうすると、HOGE_DATAで確保したメモリをchar[4]、short[2]、longの3種類の見方で見れるようになる。

たとえばこういうコードを書くとする。

HOGE_DATA d;
d.long_data = 0x12345678;

printf("char :%x %x %x %x\n", d.char_data[0], t.char_data[1], t.char_data[2], t.char_data[3]);
printf("short:%x : %x\n", t.short_data[0], t.short_data[1]);
printf("long :%x\n", t.long_data);

と、出力は

char :78 56 34 12
short:5678 : 1234
long :12345678

となる。メモリの中身は「78 56 34 12」と並んでいるわけだが、見方(型)を変えるとベツモノのように見える。
これが便利なのは、バイト単位で読んできたものをそのまま別のデータ構造として扱いたいとき。たとえば、データ読むときはバイト(char)単位だが、それに対しての処理はlongで行いたい、なんて場面。

上の例じゃそれほど有り難味はないけど、もちっとデータ構造が複雑になると中々便利な代物になるんだろうねぇ。