Big Endian 和 Little Endian的区别

  ARM体系中,每个字单元包含4个字节单元或者两个半字单元。在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian格式。在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。

   如果将一个32位的整数0x12345678(如用UltraEdit打开某个文件看到的第一行头四个字节是:"00000000h:12 34 56 78")存放到一个整型变量(int)中,这个整型变量(文件内容)采用大端或者小端模式在内存中的存储由下表所示。

  

地址偏移

大端模式

小端模式

0x00

12

78

0x01

34

56

0x02

56

34

0x03

78

12

对于文件内容 0x12345678,把前面("12")的看为高端字节,后面("78")的看为低端字节,那么可以使用"高高低低"(Little Endian),"高低高低"(Big Endian)的口诀。直观的区分,如果发现内存的内容和文件的内容在顺序上以4个字节颠倒,那么他就是Little Edian。实现Big Endian和Little Endian主要是由编译器指定的,通常是在CCFLAG 加参数,如: -DENDIAN_LITTLE,设定编译为小端字节。实际中用Trace 32可以用Memory Dump查看内存内容,和写入文件比较后判断为大端还是小端。

 

  如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。

 

 

地址偏移

大端模式

小端模式

0x00

12

34

0x01

34

12

 

由上表所知,采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将低位存放在低地址

 

  那么该如何判断CPU是大端模式还是小端模式呢??

 

  在C语言中,联合体union的存放顺序是所有成员都从低地址开始存放的。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。

  具体的代码如下:

#include "stdio.h"
int main()
{
  union w
 {
  int a;  //4 bytes
  char b; //1 byte
 } c;
  c.a=1;
  if (c.b==1)
  printf("It is Little_endian!/n");
  else
  printf("It is Big_endian!/n");
  return 1;
}

posted @ 2012-04-11 14:46  老z的博客  阅读(14306)  评论(0编辑  收藏  举报