字节序(Endian),大端(Big-Endian),小端(Little-Endian)

在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编 / 译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:

big-edian little-endian

 

 

字节顺序 Endian

现代的计算机系统一般采用字节 (Octet, 8 bit Byte) 作为逻辑寻址单位。当物理单位的长度大于1 个字节时,就要区分字节顺序 (Byte Order, or Endianness ) 。常见的字节顺序有两种:Big Endian (High-byte first)Little Endian (Low-byte first) ,这就是表2.1 中的BE LE Intel X86 平台采用Little Endian ,而PowerPC 处理器则采用了Big Endian 。举例来说,整型数字$1234ABCD 存储的时候就会有两种方式:

字节顺序

内存数据

备注

Big Endian (BE)

0xAB 0xCD 0x12 0x34

此时的0xAB 被称为most significant byte (MSB )

Little Endian (LE)

0xCD 0xAB 0x34 0x12

此时的0xCD 被称为least significant byte (LSB )

 

词源:据 Jargon File 记载, endian 这个词来源于 Jonathan Swift 1726 年写的讽刺小说 "Gulliver's Travels" (《格利佛游记》)。该小说在描述 Gulliver 畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高 6 英寸 )所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端( Big-End )剥开还是小的一端( Little-End )剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从 Big-End 剥开的人 Swift 就称作 Big-Endians 而支持从 Little-End 剥开的人就称作 Little-Endians ……(后缀 ian 表明的就是支持某种观点的人 :- )。 Endian 这个词由此而来。

   1980 年, Danny Cohen 在其著名的论文 "On Holy Wars and a Plea for Peace" 中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中, Cohen 非常形象贴切地把支持从一个消息序列的 MSB 开始传送的那伙人叫做 Big-Endians ,支持从 LSB 开始传送的相对应地叫做 Little-Endians 。此后 Endian 这个词便随着这篇论文而被广为采用。

Mapping registers to memory locations

 

 

最高有效位 MSB: Most Significant Bit

       最高有效位 (MSB) ,有时候叫做最左边的位,是在一个 n 位二进制数字中的 n-1 位,这个位有最高的权重 (2^(n-1)) 。第一个或最左边的位,当这个数字被用一般的方式书写时。

 

 

最低有效位 LSB: Least Significant Bit

       最低有效位 (LSB) 是给这些单元值的一个二进制整数位位置,就是,决定是否这个数字是偶数或奇数。 LSB 有时候是指最右边的位,因为写较不重要的数字到右边位置符号的协定。它类似于一个十进制整数的最不重要的数字,它是在一个 ( 最右边 ) 位置的数字。

 

 

大端 Big-Endian

低地址存放最高有效位( MSB ),既高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最高有效位( MSB )存放在最低端的地址上。采用这种机制的处理器有 IBM3700 系列、 PDP-10 Mortolora 微处理器系列和绝大多数的 RISC 处理器。

 

 

小端 Little-Endian

       低地址存放最低有效位( LSB ),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最不重要字节( LSB )存放在最低端的地址上。采用这种机制的处理器有 PDP-11 VAX Intel 系列微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外还常常用来描述一个字节中各个比特的排放次序。

 

 

中端 Middle-Endian

除了 big-endian little-endian 之外的多字节存储顺序就是 middle-endian ,比如以 4 个字节为例:象以 3-4-1 -2 或者 2-1-4-3 这样的顺序存储的就是 middle-endian 。这种存储顺序偶尔会在一些小型机体系中的十进制数的压缩格式中出现。

 

 

网络字节序 Network Order

TCP/IP 各层协议将字节序定义为 Big-Endian ,因此 TCP/IP 协议中使用的字节序通常称之为网络字节序。

 

 

主机序 Host Orader

它遵循 Little-Endian 规则。所以当两台主机之间要通过 TCP/IP 协议进行通信的时候就需要调用相应的函数进行主机序( Little-Endian )和网络序( Big-Endian )的转换。

 

 

C++ 怎样判别大端小端

使用宏的方法:

 

const   int  endian  =   1 ;

#define  is_bigendian() ( (*(char*) &endian) == 0 )

#define  is_littlendbian() ( (*(char*) &endian) == 1 )

 方法二:

 

bool     IsLittleEndian()

{

union   

{    

long     val;

char     Char[ sizeof ( long )];

}
u;

//     1-小端(Intel);    0-大端(Motor)

u.val 
=   1 ;  

if  ( u.Char[ 0 ==   1  )

{

//  小端

return   true ;

}
  

else   if  ( u.Char[ sizeof ( long ) - 1 ==   1  )

{

//  大端

return   false ;  

}
 

throw " Unknown! "  );

}



转自 http://blog.csdn.net/jun54555/archive/2009/04/21/4096676.aspx

 

 

小知识

    Java 使用的是 Big-Endian

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值