Big Endian  和 Little Endian 模式的别

说话到配节序的题目,必然牵涉到个别良CPU派系。那就是是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列以big
endian方式囤数据,而x86系列则使用little
endian方式囤数据。那么到底什么是big endian,什么而是little endian呢?

骨子里big endian是赖没有地址存放最高有效字节(MSB),而little
endian则是不及地址存放最低有效字节(LSB)。

   
用文字说明可能于空虚,下面用图像加以证明。比如数字0x12345678于点滴栽不同字节序CPU中的存储顺序如下所示:

Big Endian

   低地址                                            高地址

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

   |     12     |      34    |     56      |     78    |

Little Endian 

   低地址                                            高地址

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

   |     78     |      56    |     34      |     12    |

     从上面两贪图可以看出,采用big
endian方式囤数据是吻合我们人类的思维习惯的。

    
为什么而留心字节序的题目为?你或这样问。当然,如果你写的顺序只以单机环境下面运行,并且不与别人的先后打交道,那么您了好忽略字节序的存。但是,如果您的次序要和别人的次第来互动呢?尤其是当你管你当微机上运算的结果以到计算机群上去的讲话。

 

在此处自己思说说简单栽语言。C/C++语言编写的主次里多少存储顺序是暨编译平台所在的CPU相关的,而JAVA编写的顺序则唯一采用big
endian方式来囤数据。试想,如果您用C/C++语言在x86平台下编制的主次与他人的JAVA程序互通时会有什么结果?就用点的0x12345678来说,你的程序传递给人家的一个数码,将指向0x12345678的指针传被了JAVA程序,由于JAVA采取big
endian方式囤数据,很当然之它们会将你的数额翻译啊0x78563412。因此,在公的C程序传于JAVA程序之前有必要开展字节序的易工作。

 

具有网络协议也都是采取big
endian的章程来传输数据的。所以有时候我们啊会将big
endian方式叫做网络配节序。当半玉以不同字节序的主机通信时,在发送数据之前都不能不经过字节序的变换成为网络配节序后再行拓展传输。ANSI
C中提供了下四单转移字节序的特大。

一如既往鸣C语言的考题:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。

解答:

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

嵌入式系统开发者应该本着Little-endian和Big-endian模式特别了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的寄放方式是由高字节到低字节。例如,16bit宽之数0x1234以Little-
endian模式CPU内存中的存方式(假设从地址0x4000初始存放)为:

内存地址 

寄存内容 

0x4000

0x34

0x400 

0x12
  而当Big-endian模式CPU内存中的寄放方式则为:

 

内存地址

寄存内容

0x4000

0x12

0x4001

0x34

  32bit宽的数0x12345678于Little-endian模式CPU内存中的存放方式(假设从地址0x4000始存放)为: 

内存地址

存放内容

0x4000

0x78

0x4001

0x56

0x4002

0x34

0x4003

0x12

  而当Big-endian模式CPU内存中的存方式尽管也:

内存地址

存放内容

0x4000

0x12

0x4001

0x34

0x4002

0x56

0x4003

0x78

  同体union的存顺序是具有成员都打没有地址开始存放,解答用该特性,轻松地取了CPU对内存以Little-endian还是Big-endian模式读写。


 

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

比如 int a = 0x05060708

当BIG-ENDIAN的气象下存放为:

字节号 0 1 2 3

数据 05 06 07 08

以LITTLE-ENDIAN的图景下存放为:

字节号 0 1 2 3

数据 08 07 06 05

 

—-【转】