共用体(union)

共用体

 共用体の型定義

 共用体データの定義

    union 共用体タグ名 共用体名;
    
      union	cif	ucif;
      
  • typedefしてあれば、
    新しい型名 共用体名;
    
      UCIF	ucif;
      
  • または、型定義と同時に、
    union	共用体タグ名
    {
    	メンバの型 メンバ名
    	…
    } 共用体名;
    
      union	cif
      {
      	char	c[4];
      	int	i;
      	float	f;
      } ucif;
      
  • この際は共用体タグ名(cif)は無くても良い




 共用体データの初期化

  • 最初のメンバの型の値でだけ初期化できる
    union 共用体タグ名 共用体名 = { メンバ1 };
    
      union	cif	ucif = {'\xdb','\x0f','\x49','\x40'};
      
  • typedefしてあれば、
    新しい型名 共用体名 = { メンバ1 };
    
      UCIF	ucif = {'\xdb','\x0f','\x49','\x40'};
      
  • または、型定義と同時に、
    union	共用体タグ名
    {
    	メンバの型 メンバ名
    	…
    } 共用体名 = { メンバ1 };
    
      union	cif
      {
      	char	c[4];
      	int	i;
      	float	f;
      } ucif = {'\xdb','\x0f','\x49','\x40'};
      
  • この際は共用体タグ名(cif)は無くても良い




 共用体メンバの参照

共用体を使ってデータの表現を学ぼう

/* 浮動小数点数の表現 */
#include <stdio.h>

typedef	union	cif
	{
		char	c[4];
		int	i;
		float	f;
	} UCIF, *Ucif;
/*
	UCIF は union cif 型
	Ucif は union cif 型へのポインタ
*/

/* void prnum( union cif *up ) と書いても良いが... */
void prnum( Ucif up )
{
	int	i;

	printf("i = 0x%08x\n", up->i );
	printf("c = ");
	for( i = 0; i < 4; i++ )
	{
		if( i )
			printf(", ");
		printf("0x%02x", up->c[i] & 0xff );
	}
	printf("\n");
	printf("i = %d\n", up->i );
	printf("f = %f\n", up->f );
}

main()
{
	UCIF	ucif;

	printf("Input an integer: ");
	scanf("%d", &ucif.i );
	prnum( &ucif );

	printf("Input a float: ");
	scanf("%f", &ucif.f );
	prnum( &ucif );

	printf("Input a hex: ");
	scanf("%x", &ucif.i );
	prnum( &ucif );
}
/* end of union.c */
  1. double型について同様にやってみよう
  2. 日本語文字列がどのように扱われているか調べるプログラムを作ってみよう!
    (共用体を使わなくても良い)

データの内部表現を調べてみよう