[笔试题] union的原理探究

来源:互联网 发布:超级理财软件官网 编辑:程序博客网 时间:2024/05/29 18:36
请说出以下程序在intel x86环境下的执行结果。

#include<stdio.h>union{int x;char ch[2];}a;int main(){a.ch[0] = 3;a.ch[1] = 6;printf("%d\n",a.x);return 0;}

请先独立思考以后再往后看。




















首先想想union是什么情况:对于union变量,所有成员共享同一块内存空间,该内存的大小由成员变量中长度最长的变量决定。例如本题中,a的成员变量x占用两个字节的长度,ch也是占用两个字节的长度,所以变量a一共占用了两个字节的长度。
union和struct的一个重要区别就是为union所分配的内存是连续的,这个很好理解,因为这些成员变量共享一个内存空间,相当于重叠在一起,而最长的成员变量本身就是某种类型的变量(一个int变量的内存难道还是不连续的吗),所以union当然因此也是连续的。而struct的话,各个成员变量都是相互独立的,同时为了提高CPU处理struct的速度,会让成员变量做一个“对齐”处理,即不会让变量紧凑排列,(比如,只是比如)按照每四个字节的首地址存储

[面试题] union的原理探究 - Mr.Cai - --恢弘志士之气,不宜妄自菲薄
这样就显得坑坑洼洼的了。言归正传,既然知道了union是连续的,也知道int和char共享同一个内存空间了,那么只要计算出这块空间,即两个字节16个位,每个位到底是0还是1就行了。很明确,一个字节内容是3,即0000 0011,另一个字节内容是6,即0000 0110,。问题是,这两个8位数据怎么排列?
在计算机中,存放数据,有两种模式,对于一个变量,第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节),这个叫做大端模式。第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节),这个就是小端模式。具体请百度。知道了使用的是小端模式,那么,接下来问题就好解决了。

 ch[0] = 3ch[1] = 60000 0011  0000 0110x的低八位 x的高八位
所以,x = (0000 0110 0000 0011)= 1024 + 512 + 2 + 1 = 1539
你答对了吗?

1 0
原创粉丝点击