简述C语言中的存储模式(字节顺序)以及程序检测
来源:互联网 发布:剑三唐门成女捏脸数据 编辑:程序博客网 时间:2024/06/07 03:23
1.概述和定义
字节顺序,又称端序,尾序(英语:Endianness)。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。
大端序(英:big-endian)或称大尾序。
- 数据以8bit为单位:
地址增长方向 →
...
0x0A
0x0B
0x0C
0x0D
...
示例中,最高位字节是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。
- 数据以16bit为单位:
地址增长方向 →
...
0x0A0B
0x0C0D
...
最高的16bit单元0x0A0B存储在低位。
小端序(英:little-endian)或称小尾序。
- 数据以8bit为单位:
地址增长方向 →
...
0x0D
0x0C
0x0B
0x0A
...
最低位字节是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
- 数据以16bit为单位:
地址增长方向 →
...
0x0C0D
0x0A0B
...
最低的16bit单元0x0D0C存储在低位。
为了全面顺带除了大端序和小端序之外的混合序,大家就看看就算了不常用。
混合序(英:middle-endian)具有更复杂的顺序。以PDP-11为例,0x0A0B0C0D被存储为:
- 32bit在PDP-11的存储方式
地址增长方向 →
...
0x0B
0x0A
0x0D
0x0C
...
可以看作最高的16bit位和低位以大端序存储,但16bit内部以小端存储。
顺带说说,我们常用的x86架构处理器使用的是Little endian即小端序。
一般操作系统都是小端,而通讯协议是大端的。
2.字节序的判断(笔试题面试题常考的知识点)
判断方法一:
利用union类型
union类型的特点:union类型的数据所占的空间等于其最大的成员所占的空间。对union型的成员的存取都从相对于该联合体的基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始。
测试程序如下:int CheckSystemEndianUsingUnion(void){union check{int i;char c;} t;t.i=1;if(t.c==1)return (1);//小端模式elsereturn (0);//大端模式}
判断方法二:
利用int类型和char类型所占的内存空间的差异。在32位的系统,int类型占用的内存大小是4个字节,char类型占用的内存大小是1个字节。利用这一特点,可以使用指针的方法获取int类型变量的低地址的内容,并赋值到char类型的变量中,通过比较char类型变量的内容与int类型变量的内容就可以判断大端序还是小端序。int CheckSystemEndianUsingType() { int a = 1; char b = *(char *)&a; //通过将int强制类型转换成char单字节,等于取b等于a的低地址部分 if(b==1)return(1);//小端模式elsereturn(0);//大端模式 }
参考文献
[1]维基百科 http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
[2]陈正冲. C语言深度解剖[M]. 北京, 北京航空航天大学出版社, 2012.
- 简述C语言中的存储模式(字节顺序)以及程序检测
- windows下变量在内存中的字节存储顺序(c语言)
- C语言中的字节对齐和对程序的影响以及位段的定义
- C语言实现顺序存储(数组)
- C语言中的字节对齐
- C语言中的字节对齐
- C语言中的字节对齐
- C语言中的字节对齐
- C语言中的字节对齐
- c语言中的字节对齐
- 关于C语言中的存储区划分以及相关内容
- C语言中程序以及各类型数据存储位置 (转载)
- 关于位域的字节内存储顺序、字节对齐、字节序以及符号
- 关于位域的字节内存储顺序、字节对齐、字节序以及符号
- 机器字节存储顺序
- 信息存储---字节顺序
- c语言中的顺序点
- C语言中的顺序点
- 关于求余和取模的区别以及负数取摸
- uva 10396 - Vampire Numbers(暴力)
- 锚点定位
- unix 中vim的问题
- 51系列中data,idata,xdata,pdata的区别(ZZ)
- 简述C语言中的存储模式(字节顺序)以及程序检测
- delphi中记录数组的使用练习
- Log4j配置实例(log4j.xml)
- Android近期任务列表 Recent Applicatoins 分析 + Android PackageManager
- 《乔布斯传.神一样的传奇》读后感
- linux下svn客户端安装及环境配置
- cloudstack 开发软件包缺失问题及解决方法
- 外国人发短信时常用的英文缩写
- Spring Integeration学习