小字节序、低字节序)方式存储数据。

  何为大端序和小端序?

  大端序:字数据的高字节存储在低地址中。

  小端序:字数据的低字节存储在低地址中。

  其实这两个概念不难理解,但是比较容易记混。由于大端序和小端序都是从存储器的低地址开始向高地址存储数据,不同的是一个字数据中先存高字节还是先存低字节。可以记住这样一个口诀:“高大低小”。“高”是指高字节,“大”是指大端序,“低”是指低字节,“小”是指小端序,“高大低小”也即先存高字节为大端序,先存低字节为小端序。

  举个常见的例子。

  位宽为32bit的CPU,要存储的字数据为0x1234abcd,起始地址为0x4000。

  大端序:

 地址 

 0x4000 

 0x4001 

 0x4002 

 0x4003 

 内容 

 0x12 

 0x34 

 0xab

 0xcd

  小端序:

 地址 

 0x4000 

 0x4001 

 0x4002 

 0x4003 

 内容 

 0xcd 

 0xab

 0x34 

 0x12

  以上是字节域中,比较容易理解。

  下面说一下在位域中。

  先看一个例子。

1 typedef struct tagExp
 2 {
 3     WORD bit4:4;
 4     WORD bit3:3;
 5     WORD bit2:2;
 6     WORD bit7:7;
 7 } Example;
 8 
 9 union
10 {
11     Example tExp;
12     WORD result;
13 } Test;
14 
15 Test.tExp.bit4 = 10;
16 Test.tExp.bit3 = 5;
17 Test.tExp.bit2 = 1;
18 Test.tExp.bit7 = 8;

  Test.Result输出是多少呢?

  答案是,在Intel CPU上得到的结果为0x10da,在MPC8560 CPU得到的结果为0xaa88。

  下面来分析一下。

  在Intel CPU中,采用的是little-endian,从存储器的低字节开始存储,在一个字节中,从低位开始存储,低bit位存储在低bit地址。也即

大端序 android 大端序列_字节序

  (图中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

  在MCP8560 CPU中,采用的是big-endian,同样从存储器的低字节开始存储,而在一个字节中,是从高位开始存储,高bit位存储在高bit地址。也即

大端序 android 大端序列_字节序_02

  (图中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

  位域比字节域更深层了一步,是从bit的角度解释了大端序和小端序。

  综合起来,就是两句话。

高大低小:先存高字节为大端序,先存低字节为小端序。

  高高低低:大端序先把高bit位存储在高位地址,小端序先把低bit位存储在低位地址。

  最后附加一个常用的C程序来判断是大端序还是小端序。

1 bool checkCPU()
 2 {
 3     union 
 4     {
 5         int a ;
 6         char b ;
 7     } c;
 8  
 9     c.a = 1 ;
10  
11     return(c.b == 1)
12 }