【C++】共用体(union)とビットフィールド

C++

共用体(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

union

代入1

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

union

代入2

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

union

代入3

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

union

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ビットずつ分割した構造体を共用体のメンバとしている

タイトルとURLをコピーしました