9-4 <発展> 共用体

この記事は約2分で読めます。

構造体の似た概念に、共用体があります。構造体はそれぞれ独立したメモリ領域がありますが、共用体はメンバが同じメモリ領域に存在します。そのため、すべてのメンバはアドレスが同じです。定義方法は構造体と同じです。メンバアクセス演算子またはアロー演算子でメンバにアクセスすることも同じです。

//"union 共用体名" 型 
union 共用体名{
	型 変数名;
	...
};

union {
	型 変数名;
	...
}共用体変数名...;

//共用体型名 型
typedef union{
	型 変数名;
	...
}共用体型名;

メモリ領域が同じなので、例えば32ビットのint型変数に対して上位16ビットを、下位16ビットをshort型変数として取り出せます。

#include<stdio.h>
#include<stdlib.h>
typedef union{
	unsigned int n;
	unsigned short half[2];
}uniontest;
int main(void){
	uniontest var;
	var.n=1000000;
	printf("32ビット:%d\n下位16ビット:%d\n上位16ビット:%d\n",var.n,var.half[0],var.half[1]);
	return 0;
}

実行結果

32ビット:1000000
下位16ビット:16960
上位16ビット:15

メンバnに代入した1000000は2進法であらわすと

0000 0000 0000 1111 0100 0010 0100 0000

です。上位16ビットの15は

0000 0000 0000 1111

となり、下位16ビットの16960は

0100 0010 0100 0000

です。

コメント