一道经典的小端存储问题
来源:互联网 发布:java开源网站有哪些 编辑:程序博客网 时间:2024/06/09 22:07
题目也许大家都见过。也是一道经典的C面试题。
题目如下
typedef struct bitstruct{
int b1:5;
int :2;
int b2:2;
}bitstruct;
void main(){
bitstruct b;
memcpy(&b,"EMC EXAMINATION",sizeof(b));
printf("%d,%d\n", b.b1, b.b2);
}
答案是:5,-2.
这道题考到了“位域”,“Little Endian”和“内存补齐”(内存补齐只要知道sizeof(b)等于4就行,不是这题的重点)
首先是知识的普及:(如果都懂就跳过吧)
1.位域的概念和特点
2.Little-endian systems的内存布局特点
Big Endian
Little Endian
这里补充很重要的一点就是小尾不是以“字节”为单位的,而是以“位”。但是平时为什么我们不用考虑到“位”的层次呢?
因为小尾的机器按照小尾的存储方式存储数据后,再按小尾的方式来读取和构建数据,对于我们来说是透明的,无需转换。
比如:
0x45,即0100
正常情况下,C的内置数据类型最少读取1个字节(如char)。读取顺序是从低位开始读的。那么读取出来的值也应该是1010 0010.但是在构建这个char值时会逆转成 0100 0101.
这样读取出来的就还是 0x45 对应的字符为“E”。
但是特殊情况下,有可能不是读取一个字节。比如这题,只读取5位。那么读取出来的数应该是10100.构建int型也需要逆转,就成了00101.
好了现在来看题目:
首先,32位机一般以四字节对齐(内存补齐),sizeof(b)应该为4,从b的首地址后四个字节的内容应该为EMC和一个空格。
其次,对于这个结构来说只有第一个字节的八位和第二个字节的第一位有意义,也就是说只有E的八位二进制,和M的二进制的首位有意义。按照前面位段知识普及中提到的“(3)一个位段必须存储在同一存储单元中,不能跨两个单元;”为什么不是第一个字节的八位和第二字节的前两位呢?答案很简单,因为编译器不支持。
E的ASCII为0x45,即0100
在内存中的存储方式为:
低地址
其中b.b1对应1-5位即
其中b.b2对应8-9位即 01。取出来之后转换成int要逆序成10, 因为最高位为1所以是负数,
- 一道经典的小端存储问题
- 一道经典小题
- 一道经典的字符串反转问题**
- 三进制与一道经典的砝码问题
- 三进制与一道经典的砝码问题
- 三进制与一道经典的砝码问题
- 一道程序员面试的经典悖论问题
- 一道比较经典的迷宫问题
- 【BFS】一道经典的迷宫模板问题
- 一道经典概率问题
- 一道经典面试小题
- 一道有问题的小java
- 解决一道C++编程的小问题
- 计算机存储的大端小端问题
- 经典的c++小问题
- 经典的一道题目.
- 关于一道J@Whiz1.4的经典问题的说明
- 一道经典的面试题--12小球称重问题
- 【Android游戏开发十一】手把手让你爱上Android sdk自带“9妹”(9patch 工具),让Android游戏开发更方便!
- 命令行下走迷宫
- uml关系
- struts2教程:10、动态方法调用和使用通配符定义action
- C#之自动提交表单登录QQ空间
- 一道经典的小端存储问题
- C#自动登录web
- 读书笔记《30天自制操作系统》day06
- 09各大院校计算机考研录
- 8月底到12月中旬将近三个半月时间的求职经历
- 淘宝网采用什么技术架构来实现网站高负载的
- 0ra-12170 tns 连接超时
- C#中Winform动态调用Webservice的方法
- 习题9.27