Big-Endian 和 Little-Endian 两者概念的区别

Big-Endian 和 Little-Endian 两者概念的区别 
再网上查阅了很多资料(包括中英版的MSDN),反复体会,才基本弄明白一些Big-Endian和Little-Endian的含义,先总结如下:

Big-Endian 和 Little-Endian 字节排序

字节排序 含义 
Big-Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处。 
Little-Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处。


必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。

一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian     little-endian
0x0000     0x12              0xcd
0x0001     0x34              0xab
0x0002     0xab              0x34
0x0003     0xcd              0x12
(注意:0xab换算成2进制是10101011,是个8位的数。我刚才居然当成4位了,自己把自己搞晕了,shit。)

-----------
疑问:为什么要以一个Word为基础单位来分割而不是一个DoubleWord或者Byte?究竟就是这么定义的还是跟具体的CPU有关,跟具体的模式(比如说16位模式、32位模式、64位模式的LE和BE定义会不同)有关?我实在是不清楚,望知道的大侠不吝指点,也希望有这方面资料(文章、代码)的朋友贴一些上来。 
posted on 2005-02-22 23:59 乾坤一笑 阅读(2076) 评论(18)  编辑 收藏
Feedback 
# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-23 09:12 | freedk 
  big-endian     little-endian 
0x0000     0x12              0xcd 
0x0001     0x23这里是23,难道不是34??            0xab 
0x0002     0xab              0x34 
0x0003     0xcd              0x12


# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-23 09:49 | 穿越无边 
估计是笔误


# 楼上不要吹毛求疵啊,:)2005-02-23 15:44 | gyshen 
楼上不要吹毛求疵啊,:)

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-23 16:21 | gyshen 
如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。 
这句话的意思,不明白。

big endian的意思就是最高位在低内存位置,最低位在高内存位置。

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-23 18:34 | 周星星 
顶gyshen所说的,big endian的意思就是高位在前,低位在后,little endian则相反,哪有什么“必须先按Word分成若干部分”的说法,int16如是,int32、int64也如是,float如是,double也如是。

# to gyshen & 周星星:2005-02-23 19:43 | 乾坤一笑 
不知道我下面这段说的准确不: 
WORD的意思是字长,(撇开WINDOWS先不谈,) 一个机器的字是访问内存的单位,就是说系统是以字来访问内存的。不同机器的字长可能不同,比如字长为4字节的话,那么所有的word从word address的0开始线性增加,Byte 1 - 4 放在地址0里面表示第一个word, byte 5 - 8 放在地址1里面表示第二个word,以此类推。那么可能有下面的图: 
Big-Endian Format:

bit--> 31~24 23~16 15~8 7~0 
high address word address 
^ 5 6 7 8 0001 
| 1 2 3 4 0000 
low address 
(图正中间的 1~8 表示第几个被读出字节)

Little-Endian Format:

bit--> 31~24 23~16 15~8 7~0 
high address word address 
^ 8 7 6 5 0001 ^ 
| 4 3 2 1 0000 | 
low address 
(图正中间中的 1~8 表示第几个被读出字节)


# to freedk :2005-02-23 19:47 | 乾坤一笑 
改过了

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-23 23:29 | rovershen 
跟word或者说字长根本就没关系,只是字节的排列顺序而已。 
big endian:最高字节在地址最低位,最低字节在地址最高位,依次排列。 
little endian:最低字节在最低位,最高字节在最高位,反序排列。

目前应该little endian是主流,因为在数据类型转换的时候(尤其是指针转换)不用考虑地址问题

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-24 09:03 | freedk 
to:rovershen "目前应该little endian是主流,因为在数据类型转换的时候(尤其是指针转换)不用考虑地址问题" 举个例来看看

# to rovershen :2005-02-24 19:47 | 乾坤一笑 
如果说"跟word或者说字长根本就没关系",假设有一数据文件里面有N多数顺序排布,如果想以Little-Endian format读入内存某区域,那么应该怎么读?怎么排?

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-02-25 21:36 | 问题男 
目前的存储器,多以byte为访问的最小单元,于是endian的问题应运而生了,当一个逻辑上的整理必须分割为物理上的若干单元时就存在了先放谁后放谁的问题

存在“如果说"跟word或者说字长根本就没关系",假设有一数据文件里面有N多数顺序排布,如果想以Little-Endian format读入内存某区域,那么应该怎么读?怎么排?”这样的问题是由于对于endian的实质理解的偏差,endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系。这里的“有一数据文件里面有N多数顺序排布”,这个“有一数据”显然不是逻辑上的最小单元,而其中的“N多数”的一个才是逻辑最小单元,于是可应用楼主表格中的原则排列,而“N多数”之间的顺序则是由这“N多数”的宿主决定的,比如是你写的程序,这个顺序由你决定

刚才谈到了,endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系。咱们接触到的物理单元最小都是byte,在通信领域中,这里往往是bit,不过原理也是类似的。

实践可以给你更多的经验,比如在一个嵌入式系统的通信协议中,从底层射频驱动到上层的协议栈全部需要实现,那么很可能遇到多个endian的问题,底层的bit序、协议层的byte序、应用层的byte序,这些都是不同的概念

絮絮叨叨,一些拙见

# to 问题男:2005-02-25 21:38 | 乾坤一笑 
嗯,你的解释让我头脑清晰了很多,谢谢!:)

# to freedk2005-02-25 22:18 | rovershen 
没记错的话,除了moto的68K系列和dec的sparc是big endian外,常见的cpu都是little endian。ARM同时支持big和little,实际应用中通常使用little endian。我所说的指针转换,实际上指编译器的隐式处理。 
假设有个32位的整数,地址是0x10000000,现在要将它作为16位整数处理,忽略高位,如果是little endian,则直接从0x10000000取得,而如果是big endian,则要从0x10000002取得。


# to 一笑2005-02-25 22:25 | rovershen 
关于n多数据的处理,跟endian模式又没有关系了,只要是同种endian模式,怎么存就怎么取。。。

# to rovershen :2005-02-25 22:37 | 乾坤一笑 
嗯,这玩艺确实很抽象,回来编写代码实践实践就好了。

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-03-22 00:12 | 穿越无边 
这两个术语来自于 Jonathan Swift 的《《格利佛游记》其中交战的两个派别无法就应该从哪一端--小端还是大端--打开一个半熟的鸡蛋达成一致。:) 
在那个时代,Swift是在讽刺英国和法国之间的持续冲突,Danny Cohen,一位网络协议的早期开创者,第一次使用这两个术语来指代字节顺序,后来这个术语被广泛接纳了 
摘自《深入理解计算机系统》 
很好的一本书:)

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-03-26 10:24 | 阿荣 
字节序一般是硬件的特点,除了常见的你说的这两种,还有其他很多种,你可以看看XML技术内幕这本书,介绍了很多

# re: Big-Endian 和 Little-Endian 两者概念的区别2005-04-01 15:51 | 绅士亦花心 
回问题男: 
是呀,现在我们并没有考虑位的顺序,因为我们处理的最小单元是字节,我们都假定它是低位在右,高位在左,在一些硬件设备中,位的顺序也会有所变化,那么当我们访问位时,就要注意位的顺序,不知道这个叫什么名词。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值