昨日、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で行いたい、なんて場面。
上の例じゃそれほど有り難味はないけど、もちっとデータ構造が複雑になると中々便利な代物になるんだろうねぇ。