简述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.

0 0