C言語における共用体unionの書式は、構造体structと同じである。
union 共用体名{ 変数群 };
構造体を利用した場合
struct a_and_b{
unsigned char a;
unsigned char b;
};
unsigned char a;
unsigned char b;
};
#include <stdio.h>
int main(void)
{
struct a_and_b{
unsigned char a;
unsigned char b;
};
{
struct a_and_b{
unsigned char a;
unsigned char b;
};
struct a_and_b x;
x.a = 3;
x.b = 5;
x.b = 5;
printf("%d\n",x.a);
printf("%d",x.b);
printf("%d",x.b);
return 0;
}
}
この場合、画面には
3
5
と表示される。
共用体を利用した場合
union a_and_b{
unsigned char a;
unsigned char b;
};
unsigned char a;
unsigned char b;
};
この場合、変数aと変数bはどちらもレジスタAを利用する。
なので、
#include <stdio.h>
int main(void)
{
union a_and_b{
unsigned char a;
unsigned char b;
};
{
union a_and_b{
unsigned char a;
unsigned char b;
};
union a_and_b x;
x.a = 3;
x.b = 5;
x.b = 5;
printf("%d\n",x.a);
printf("%d",x.b);
printf("%d",x.b);
return 0;
}
}
の場合、画面に表示されるものは
5
5
になってしまう。変数の型がどちらも同じ2つの変数に格納される数値が同じになってしまうのである。
unionは、特定の変数の別名を作るためにも利用できるのである。
共用体をうまく利用した場合
union a_and_b{
unsigned char a;
unsigned short int b;
};
unsigned char a;
unsigned short int b;
};
なので、
#include <stdio.h>
int main(void)
{
union a_and_b{
unsigned char a;
unsigned short int b;
};
{
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;
}
printf("%d\n",x.b);
printf("%d",x.a);
return 0;
}
の場合、画面に表示されるものは
260
4
となる。
260は2進数で表したら、00000001 00000100となる。
その上位8ビットを除去した数値00000100が、変数aに格納されている数値である。