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