【发布时间】:2017-06-06 19:55:23
【问题描述】:
我正在学习 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。
【问题讨论】:
-
我猜你只能访问最后修改的值,不是吗?
-
@SouravGhosh:这是一个棘手的问题。我将 C 标准解释为保证您可以使用联合进行类型双关(如
memcpy())。 -
@L.M 你期望
month包含什么? (没有双关语的意思,但您应该提及您希望看到的内容) -
@EOF 当然可以,当然,只需要加倍小心,你最终可能会陷入陷阱。 :) 我之前没说的是“安全”。
-
@SouravGhosh 假设您的实现中
char等效于unsigned char,您可以安全地访问.month和.day而不必担心陷阱表示。