Big Endian  和 Little Endian 形式的区分

—-【转】

0x56

 —————————————————————————–>

内部存款和储蓄器地址

内部存款和储蓄器地址

嵌入式系统开发者应该对Little-endian和Big-endian方式特别驾驭。采纳Little-endian形式的CPU对操作数的寄放模式是从低字节到高字节,而Big-endian情势对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-
endian形式CPU内存中的寄放方式(假若从地址0x伍仟从头存放)为:

  32bit宽的数0x12345678在Little-endian方式CPU内部存款和储蓄器中的寄放方式(倘诺从地址0x伍仟开始存放)为: 

   |     78     |      56    |     34      |     12    |

 

0x4000

在LITTLE-ENDIAN的情事下存放为:

0x4000

谈到字节序的难点,必然牵涉到两大CPU派系。那正是OPPO的PowerPC连串CPU和速龙的x86种类CPU。PowerPC类别选用big
endian情势存款和储蓄数据,而x86体系则选用little
endian形式存款和储蓄数据。那么到底什么是big endian,什么又是little endian呢?

0x4003

存放内容

数据 05 06 07 08

0x34

在此间作者想说说三种语言。C/C++语言编写的程序里多少存款和储蓄顺序是跟编写翻译平台所在的CPU相关的,而JAVA编写的先后则唯一选择big
endian方式来囤积数据。试想,要是您用C/C++语言在x86平台下编写制定的次序跟别人的JAVA程序互通时会发生什么结果?就拿地方的0x12345678以来,你的程序传递给别人的一个数额,将指向0x12345678的指针传给了JAVA程序,由于JAVA选用big
endian方式存款和储蓄数据,很当然的它会将您的数额翻译为0x78563412。因而,在你的C程序传给JAVA程序以前有须求开始展览字节序的转移工作。

X86 系列 CPU都是 little-endian 的
BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数额有关,比如int,short,long型。

   |     12     |      34    |     56      |     78    |

0x56

抱有网络协议也都以利用big
endian的法子来传输数据的。所以有时候大家也会把big
endian形式叫做网络字节序。当两台使用分裂字节序的主机通讯时,在发送数据以前都无法不通过字节序的转换来为互联网字节序后再展开传输。ANSI
C中提供了上边五个转移字节序的宏。

实际上big endian是指低地址存放最高有效字节(MSB),而little
endian则是低地址存放最低有效字节(LSB)。

在BIG-ENDIAN的景况下存放为:

0x78

  
—————————————————————————–>

0x4001

0x400 

0x4000

int checkCPU()
{
 {
  union w
  {
   int a;
   char b;
  } c;
  c.a = 1;
  return (c.b == 1);
 }
}

0x34

 

一道C语言的试题:请写3个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。

0x34

寄存内容

0x78

Little Endian 

0x4000


0x4002

比如 int a = 0x05060708

   
用文字表达也许相比较空虚,上边用图像加以证实。比如数字0x12345678在二种不一致字节序CPU中的存款和储蓄顺序如下所示:

  而在Big-endian情势CPU内部存款和储蓄器中的存放格局则为:

寄存内容 

 

0x4001

Big Endian

0x12

   低地址                                            高地址

 

 

0x4002

0x34

0x4003

0x12
  而在Big-endian方式CPU内部存款和储蓄器中的存放情势则为:

0x12

解答:

    
为何要留心字节序的标题啊?你大概那样问。当然,要是你写的顺序只在单机环境下边运营,并且不和旁人的先后打交道,那么你一点一滴能够忽略字节序的留存。然则,假若你的次序要跟外人的次序产生互动呢?越发是当您把您在微型总结机上运算的结果使用到总结机群上去的话。

字节号 0 1 2 3

寄存内容

内部存储器地址 

     从地点两图能够看来,选用big
endian格局存储数据是相符我们人类的思维习惯的。

内部存储器地址

0x12

数据 08 07 06 05

  联合体union的存放顺序是享有成员都从低地址开始存放,解答利用该本性,轻松地收获了CPU对内存接纳Little-endian还是Big-endian格局读写。

0x4001

字节号 0 1 2 3

   低地址                                            高地址