我进入C语言并尝试了并集。我的代码如下:

#include <stdio.h>

union date {
 int year  ;
 char month;
 char day  ;
 };

int main() {
 union date birth;
 birth.year = 1984;
 birth.month = 7;
 birth.day = 28;
 printf("%d, %d, %d\n",birth.year, birth.month, birth.day);
 // return 1820,28,28
 return 0;
}
  • 1984以二进制形式写为0111 1100 0000
  • 7以二进制形式写为0110
  • 28以二进制形式编写为0001 1100

  • 我知道由于联合,birth.year的值为0111 0001 1100,即1820。但是我不明白birth.month为什么返回值为28。

    最佳答案

    引用C11,第§6.7.2.1章(重点是我的)



    因此,您期望的依据是错误的。您不能同时拥有一个工会的所有成员的值,只能拥有一个。

    另外,从第6.5.2.3节的脚注95开始,



    在这里,最后分配的值day恰好与month的大小相同,因此,当您尝试读取day时,它将返回month的值。

    10-05 19:50