共用体union

C言語における共用体unionの書式は、構造体structと同じである。

union 共用体名{ 変数群 };

構造体structが中の変数をそれぞれ違うレジスタに格納するのに対し、共用体は複数の変数を格納するレジスタがあるもの。



以下にて、レジスタAとレジスタBはそれぞれ1バイトとする。

構造体を利用した場合
struct a_and_b{
      unsigned char a;
      unsigned char b;
};

この場合、変数の型が1バイトの変数aはレジスタAに、変数bはレジスタBに格納される。

イメージ 1


#include <stdio.h>

int main(void)
{
   struct a_and_b{
      unsigned char a;
      unsigned char b;
   };

   struct a_and_b x;

   x.a = 3;
   x.b = 5;

   printf("%d\n",x.a);
   printf("%d",x.b);

   return 0;
}

この場合、画面には
3
5
と表示される。


共用体を利用した場合
union a_and_b{
      unsigned char a;
      unsigned char b;
};


この場合、変数aと変数bはどちらもレジスタAを利用する。

イメージ 2


なので、

#include <stdio.h>

int main(void)
{
   union a_and_b{
      unsigned char a;
      unsigned char b;
   };

   union a_and_b x;

   x.a = 3;
   x.b = 5;

   printf("%d\n",x.a);
   printf("%d",x.b);

   return 0;
}

の場合、画面に表示されるものは
5
5
になってしまう。変数の型がどちらも同じ2つの変数に格納される数値が同じになってしまうのである。
unionは、特定の変数の別名を作るためにも利用できるのである。

共用体をうまく利用した場合
union a_and_b{
      unsigned char a;
      unsigned short int b;
};

この場合、型が1バイトの変数aはレジスタAに、型が2バイトの変数bはレジスタA,レジスタBに格納される。
イメージ 3


なので、

#include <stdio.h>

int main(void)
{
   union a_and_b{
      unsigned char a;
      unsigned short int b;
   };

   union a_and_b x;

   x.b = 260;
   printf("%d\n",x.b);
   printf("%d",x.a);
   return 0;
}

の場合、画面に表示されるものは
260
4
となる。

260は2進数で表したら、00000001 00000100となる。
その上位8ビットを除去した数値00000100が、変数aに格納されている数値である。
レジスタBには変数bの上位8ビットの数値が、レジスタAには変数bの下位8ビットの数値が格納されているのである。
イメージ 4