共用体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,于是得到了这样的输出。
标签:ch,0000,字节,union,258,低字节,共用 来源: https://blog.51cto.com/u_14201949/2831992