複数の で一つの を共用するもののこと。
例えば…
union port{
unsigned char byte;
struct bit{
unsigned char b0:1;
unsigned char b1:1;
…(b2~b6まで省略)
unsigned char b7:1;
}
}とすると、port.byte(unionの使い方structと同じ)とport.bitは同じメモリに割り当てられる。※unsigned char b0:1;はb0という変数名で1ビット確保するという意味である。
例えば
union port p; (port型の変数p)とすると
p.byte = 4;
printf("%d\n",p.bit.b2);
1が出力される(たぶん)これはunionの中にあるbyteとbitは同じメモリ領域を共有されるためbyteの0ビット目とbit.b0、byteの1ビット目とbit.b1…が同じビットを指す。なのでp.byteに4を代入するとp.byteの2ビット目が1になる。すなわちp.bit.b2が1になるわけである。
共用体の利点
プログラムの可読性が向上する(主に組込みシステムにおいて)
→共用体を用いることで が可能になるから。
R8Cマイコンではたとえばp2の3ビット目を共用体を用いてp2_3と置き換えてビット単位でのアクセスを可能にしている。通常変数の特定のビットを操作するときはマスク処理が必須になるが共用体を用いると不要になる。
(例:p2の3ビット目にp1の3ビット目を代入する
//共用体を用いない例
p2 = (p2 & 0xf7) | (p1 & 0x08);
//共用体を用いる例
p2_3 = p1_3;
共用体の問題点
・
メモリないのデータ格納方法に関するCPUアーキテクチャの違い。
共用体におけるビットの配置も異なることがある。
・
・
・
練習問題やっておくとよいです