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

 

—-【转】