共用体型( ''union type'' )は、メンバー・オブジェクトのオーバーラップする空でないセットを記述します。
それぞれのオブジェクトは、オプションで指定された名前と、場合によっては異なるタイプを持っています。
共用体の構文は、構造体と似ていますが共用体にはビットフィールドが無いのが大きな違いです。、共用体の全てのメンバーはメモリー上の一箇所に格納されている点が異なります。
共用体のサイズは、共用体のもっとも大きなメンバーのサイズになります。
演習
構造体のメンバーと共用体のメンバーのアドレスについて考えてみましょう。
共用体を定義し、共用体タグを使って共用体変数を宣言します。
共用体タグの定義:
union タグ名 {
	データ型 メンバー名;
		:
		:
};
共用体変数の宣言:
union タグ名 変数名リスト;
共用体タグの定義と共用体の宣言とを同時に行うこともできる。
共用体タグの定義と共用体の宣言とを同時に行う:
union タグ名 {
	データ型 メンバー名;
		:
		:
} 変数名リスト;
形式
構文は、構造体のメンバーへのアクセスと同一です。
[https://paiza.io/projects/voWT0wzq_5nhfDwp9ymvWg?language=c 共用体の例]:
int main(void) {
  for (double *p = (double[]){0.0, 1.0, -1.0, 2.0, NAN, INFINITY, -INFINITY, 999.0}; *p != 999.0; p++) {
    union {
      long l;
      double d;
    } u;
    u.d = *p;
    printf("%6.3f = %#18lx\n", u.d, u.l);
  }
}
実行結果:
 0.000 =                  0
 1.000 = 0x3ff0000000000000
-1.000 = 0xbff0000000000000
 2.000 = 0x4000000000000000
   nan = 0x7ff8000000000000
   inf = 0x7ff0000000000000
  -inf = 0xfff0000000000000
long と double をメンバーとする共用体を用意してIEEE 754の64ビット倍精度浮動小数点数のバイナリ表現を表示しました。
このコードは sizeof(long) == sizeof(double) == 8 であることを仮定しています。
倍精度浮動小数点数のビットレイアウト
[https://paiza.io/projects/lisQhWz_Qdl1R5g0CYSooQ?language=c 共用体とビットフィールドの例]:
int main(void) {
  for (double *p = (double[]){0.0, 1.0, -1.0, 2.0, NAN, INFINITY, -INFINITY, 3.1415926536, 999.0}; *p != 999.0; p++) {
    union {
      long l;
      double d;
      struct {
          long fract : 52,
               exp : 11,
               sign : 1;
      };
    } u;
    u.d = *p;
    printf("%6.3f = %#18lx, sign = %s, exp = %d, fract = %d\n", u.d, u.l, u.sign ? "+" : "-", u.exp, u.fract);
  }
}
実行結果:
 0.000 =                  0, sign = -, exp = 0, fract = 0
 1.000 = 0x3ff0000000000000, sign = -, exp = 1023, fract = 0
-1.000 = 0xbff0000000000000, sign = +, exp = 1023, fract = 0
 2.000 = 0x4000000000000000, sign = -, exp = -1024, fract = 0
   nan = 0x7ff8000000000000, sign = -, exp = -1, fract = 0
   inf = 0x7ff0000000000000, sign = -, exp = -1, fract = 0
  -inf = 0xfff0000000000000, sign = +, exp = -1, fract = 0 
3.142 = 0x400921fb544486e0, sign = -, exp = -1024, fract = 1413777120