我正在阅读K&R关于C语言联合体的内容,据我理解,联合体中的单个变量可以存储多种类型之一。如果将某些东西作为一个类型存储,并作为另一个类型提取,则结果纯粹是由实现定义的。
现在请检查此代码片段:
#include<stdio.h>
int main(void)
{
union a
{
int i;
char ch[2];
};
union a u;
u.ch[0] = 3;
u.ch[1] = 2;
printf("%d %d %d\n", u.ch[0], u.ch[1], u.i);
return 0;
}
输出:
3 2 515
我正在将值分配给 u.ch
,但是从 u.ch
和 u.i
中检索。这是实现定义的吗?还是我做了什么很愚蠢的事情?
我知道这可能对其他人来说似乎非常初级,但我无法找出输出背后的原因。
谢谢。
u.ch[0]=3;
?为什么会出现警告呢?char
只是整型类型中最短的一种,为什么不能接受用十进制写的值呢?同样地,也没有阻止使用int x='c';
。在你的解释中,“signed char”和“unsigned char”哪一个应该为ASCII码保留,另一个有什么用途? - Pascal Cuoqprintf("sizeof literal char: %d\n", (int)sizeof 'X');
。 - pmg