Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52175
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 261
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-23 20:01
个人简介

专注于嵌入式系统软件及驱动开发。

文章分类

全部博文(3)

分类: C/C++

2014-06-21 12:20:30

不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的。

存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)小端模式(Little Endian)

大端存储模式是指字或半字的最高字节(MSB)存放在内存的最低位字节地址上,而字数据的低字节(LSB)则存放在高地址中。打个比方,有一个字为0x12345678,这个字由4个字节组成, 从高位到低位的次序为:0x12,0x34,0x56,0x78。如果把这个字存放在以0x00000000起始的内存中,这个字在内存中的实际存放情况 如下表:

内存地址

存储的数据(Byte)

0x00000000

0x12

0x00000001

0x34

0x00000002

0x56

0x00000003

0x78

0x00000004

……


大端模式的次序就像是我们平时书写的次序,先写大数,后写小数。另外,大端存储次序还广泛运用在TCP/IP协议上,因此又称为网络字节次序

小端存储模式是指字或半字的最低位字节(LSB存放在内存的最低位字节地址上,而字数据的高字节(MSB则存放在高地址中。还以0x12345678为例,在小端模式下存储如下表所示:

内存地址

存储的数据(Byte)

0x00000000

0x78

0x00000001

0x56

0x00000002

0x34

0x00000003

0x12

0x00000004

……


说明:其中一个数据的最重要的位为MSB(Most Significant Byte/Bit),最不重要的位叫做LSB(Least Significant Byte/Bit),重不重要是看它在整个数据中所占的权重相关的,如0x1234568的MSB即为0x12(占大头,如果0x12没有了,那么整 个数的值就下降了太多),LSB为0x78(最后两位,如果0x78没有了,对整个数的影响较小)。Big Endian和Little Endian的区别就是Big Endian规定MSB在存储时放在低地址,在传输时MSB放在流的开始,LSB存储时放在高地址,在传输时放在流的末尾,即高位优先;Little Endian则相反。

并且还需要注意的几点是:

(1)   数据在寄存器中都是以大端模式次序存放的。

(2)   对于内存中以小端模式存放的数据。CPU存取数成时,小端和大端之间的转换是通过硬件实现的,没有数据加载/存储的开销。


知道了大小端模式的概念,但如果让我们用C语言写段代码判断一个CPU是大端模式还是小端模式应当如何做呢 ?

一种比较第简单的方法如:

  1. int CheckEndian(void)
  2. {
  3.     int a = 0x12345678;
  4.     char *p = (char*)(&a);
  5.     
  6.     if(0x78 == *p){
  7.         return Little_Endian;
  8.     }else{
  9.         return Big_Endian;
  10.     }  

  11. }

另外还可以用到联合体(union)来实现,简单的说union就是一种结构,在union中所有的数据成员共用一个存储空间,在同一时间只能存储其中的一个数据成员,所有的数据成员具相同的起始地址,相对于基地址的偏移量都为0;

采用union来判断,具体代码如下:


  1. int CheckEndian(void)
  2. {
  3.     union check
  4.     {
  5.         int Word;
  6.         char Byte; 
  7.     } Endian;
  8.   
  9.     Endian.Word=1;
  10.   
  11.     if(1 == Endian.Byte) {
  12.         return Little_Endian;
  13.     }else{
  14.         return Big_Endian;
  15.     }         
  16. }


阅读(4654) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:Vim入门必知必会

给主人留下些什么吧!~~