共用体union

union共用体名

{

  类型名 成员名1;

  类型名 成员名2;

  ……

  类型名 成员名n;

}

  由于各个成员变量在内存中都使用同一段存储空间,因此共用体变量的长度等于最长的成员长度,共用体的访问方式和结构体类似。

  下面是一个用共用体的程序,推断一下这个程序的输出是什么:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     union key{
 6         int k;
 7         char ch[2];
 8     }u;
 9     
10     u.k = 258;
11     printf("%d %d\n", u.ch[0], u.ch[1]);  
12     return 0;
13 }

正确的输出是:,你做对了吗?

一开始我以为输出结果是: 1  2,因为258的二进制表示为:0000 0001 0000 0010,这两个字节分别为1 和 2

后来我又认为答案是:0 0, 因为258完整的4字节二进制表示是:0000 0000 0000 0000 0000 0001 0000 0010前两个字节值为0,这里的错误就是ch应该是从低字节开始存的,所以占用的应该是int的两个低字节空间,但是前面的把258的4字节完整展开的形式就让我误以为这就是258在内存中的存储形式,认为前面两个字节就是低字节,从而误以为ch是占用的是前面两个值为0的字节,但是,但是这种展开式其实是高字节在前,低字节在后,所以258在内存中实际的存储形式是所以低字节是02 和01,所以ch[0] 应该等于02, ch[1] 应该等于01,于是得到了这样的输出。

 

posted @ 2018-09-27 21:12  Lucky小黄人^_^  阅读(159)  评论(0编辑  收藏  举报