二级C输出

来源:百度知道 编辑:UC知道 时间:2024/06/18 12:23:10
main()
{ union{ unsigned char c;
unsigned int i[4];}z;
z.i[0]=ox39;
z.i[1]=0x36;
printf("%c\n",z.c);
}
输出为什么是9而不是6呢?

因为你这里用的是 union
union 是说 成员间共用同一块存储空间
就是 unsigned char c 和 unsigned int i[4]
所以 c 的地址 就是 i[0] 的地址

z.i[0]=ox39;
z.i[1]=0x36;
赋值以后

i[0]的值是 ox39
c 对齐的是i[0]的低位
c的值当然是 ox39

z.i[1]的值不会影响到z.i[0]的值

ox39,十进制 57 ,当然输出 9

你上面的程序时错误的,因为按照你的要求得不到9
printf("%c\n",z.c);
改为printf("%d\n",z.c);才有结果。
现在来说说你 为什么要得到9.
因为union时共有内存,与结构体时不一样的。

ox39 = '9' ,根据联合的对齐规则,char c 对齐的是第一个字节,刚好是i[0]的低位(intel是按字节反过来排的,最低的字节在最前面),你的ox39只有一个字节,也就是i[0]最低位的那个字节了,按字符输出当然是‘9’了

c语言中联合体变量z占8个字节吧,而i[0]->i[3]从低字节到高字节存放。z.c就是取存储地方的低字节8位,也即i[0]的0x39=(57)10,ASII57对应的字符也就是9