共用体(union)
サンプルソース
int main() {
union IntTest {
int int4; // int型のバイト数:4バイト
short short2[2]; // short型のバイト数:2バイト
unsigned char char1[4]; // char型のバイト数:1バイト
};
union IntTest u;
u.int4 = 0;
u.short2[1] = 0xffff; // 代入1
cout << hex << u.int4 << '\n';
u.char1[3] = 0xab; // 代入2
cout << hex << u.int4 << '\n';
u.char1[0] = 0x01; // 代入3
cout << hex << u.int4 << '\n';
return 0;
}
実行結果
ffff0000
abff0000
abff0001
変数int4に0を代入することで、配列short2、配列char1もすべて0

代入1
short2[1]に0xffffを代入すると、変数int4の先頭2バイト、配列char1[3]、char1[2]もffとなる

代入2
配列char1[3]に0xabを代入すると、変数int4の先頭1バイト、short2[0]の先頭1バイトもabとなる

代入3
配列char1[0]に0x01を代入すると、変数int4の末尾2バイト、short2[0]も1となる

unionを使うと、1つの変数領域に値をバラバラに設定できる。
共用体(union)とビットフィールド
サンプルソース
int main(void) {
// ビットフィールドの宣言:すべて1ビットで宣言
struct bits {
unsigned char b1 : 1; // データ型 変数名 : ビット数
unsigned char b2 : 1;
unsigned char b3 : 1;
unsigned char b4 : 1;
unsigned char b5 : 1;
unsigned char b6 : 1;
unsigned char b7 : 1;
unsigned char b8 : 1;
};
union {
unsigned char uch;
struct bits b;
} u;
u.uch = 0xff;
cout << "u.uchの値は" << hex << (unsigned int) u.uch << "です\n";
cout << "u.uchのビット表示は"
<< (unsigned int)u.b.b1 << (unsigned int)u.b.b2 << (unsigned int)u.b.b3 << (unsigned int)u.b.b4
<< (unsigned int)u.b.b5 << (unsigned int)u.b.b6 << (unsigned int)u.b.b7 << (unsigned int)u.b.b8
<< "です\n";
cout << "uのサイズは" << sizeof(u) << "バイトです\n";
return 0;
}
実行結果
u.uchの値はffです
u.uchのビット表示は11111111です
uのサイズは1バイトです
8ビットをそれぞれ1ビットずつ分割した構造体を共用体のメンバとしている