内存的字节存储大小端问题(二)

来源:互联网 发布:centos libgcc s.so 编辑:程序博客网 时间:2024/06/08 08:14

大端和小端(网络字节序和主机字节序):
大端(Big Endian):即网络字节序。
小端(Littile Endian):即主机字节序。

记忆方式:

网络的范围很大,所以大端是网络字节序。

大端方式将高位字节存放在起始地址,小端方式将低位字节存放在起始地址。
采用大端方式进行数据存放符合人类的正常思维(如我们手写一个数字一样,起笔都是从高位数据先写),而采用小端方式进行数据存放利于计算机处理。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。

对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。

小端模式,则刚好相反。

 

注意:

              字节的大端序还是小端序是由CPU决定的。

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。


网络字节序:就是大端字节序。规定不同系统间通信一律采用网络字节序。

 

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。
为简单起见,本书使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

---------------------------
地址偏移 大端模式 小端模式
0x00     12(OP0) 78(OP3)
0x01     34(OP1) 56(OP2)
0x02     56(OP2) 34(OP1)
0x03     78(OP3) 12(OP0)
---------------------------

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

---------------------------------
地址偏移 大端模式 小端模式
0x00     12(OP0) 34(OP1)
0x01     34(OP1) 12(OP0)
-------------------------------------


不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器                 操作系统     字节排序
Alpha                 全部         Little endian
HP-PA                NT           Little endian
HP-PA                UNIX         Big endian
Intelx86            全部         Little endian <-----x86系统是小端字节序系统
Motorola680x() 全部         Big endian
MIPS                 NT           Little endian
MIPS                 UNIX         Big endian
PowerPC           NT           Little endian
PowerPC           非NT          Big endian   <-----PPC系统是大端字节序系统
RS/6000            UNIX          Big endian
SPARC               UNIX          Big endian
IXP1200 ARM核心   全部          Little endian