[笔试题] union的原理探究
来源:互联网 发布:超级理财软件官网 编辑:程序博客网 时间:2024/05/29 18:36
请说出以下程序在intel x86环境下的执行结果。
首先想想union是什么情况:对于union变量,所有成员共享同一块内存空间,该内存的大小由成员变量中长度最长的变量决定。例如本题中,a的成员变量x占用两个字节的长度,ch也是占用两个字节的长度,所以变量a一共占用了两个字节的长度。
union和struct的一个重要区别就是为union所分配的内存是连续的,这个很好理解,因为这些成员变量共享一个内存空间,相当于重叠在一起,而最长的成员变量本身就是某种类型的变量(一个int变量的内存难道还是不连续的吗),所以union当然因此也是连续的。而struct的话,各个成员变量都是相互独立的,同时为了提高CPU处理struct的速度,会让成员变量做一个“对齐”处理,即不会让变量紧凑排列,(比如,只是比如)按照每四个字节的首地址存储
请先独立思考以后再往后看。#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是连续的,也知道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
你答对了吗?
在计算机中,存放数据,有两种模式,对于一个变量,第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节),这个叫做大端模式。第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节),这个就是小端模式。具体请百度。知道了使用的是小端模式,那么,接下来问题就好解决了。
ch[0] = 3ch[1] = 60000 0011 0000 0110x的低八位 x的高八位
所以,x = (0000 0110 0000 0011)= 1024 + 512 + 2 + 1 = 1539
你答对了吗?
1 0
- [笔试题] union的原理探究
- [笔试题] union的原理探究
- Union类型的一道笔试题
- 朗讯的笔试题 union struct
- union--一道经典的C++笔试题
- union笔试题
- 探究一个笔试题
- 一道关于联合(union)的笔试题
- 微软2013暑期笔试一道题的探究
- C++ union enum 探究
- 探究HashMap的实现原理
- 关于大小端和union的一道极易错的笔试题
- 笔试题:session的工作原理
- 看清原理 探究彻底清除木马的方法
- (三)AJAXPro之旅---原理的探究
- 深入探究MODVERSIONS的实现原理
- 探究Handler+Message机制的原理
- 深入探究HashMap的实现原理
- HDU 1035 Robot Motion (搜索-DFS)
- NBUT 2012 Weekly - 16th Mar for 12x
- opencv混合高斯模型
- [笔试题] 指出程序片段的三个错误
- [C#] C#中的委托,你熟练了吗
- [笔试题] union的原理探究
- android面试题六
- [杂谈] 计算机中的小端模式和大端模式
- Google揭露“仙女座”虚拟网络,及分散和集中架构之辩
- [杂谈] C#中的集合初始化器&&匿名类
- [笔试题] 金山2013开发笔试 - 读程序,写结果
- [杂谈] 填空题 - 宏定义的使用
- [杂谈] 路遇一脑残题 - a++以及++a
- [C++] C++的拷贝构造函数浅析