[关闭]
@yiltoncent 2015-11-18T07:39:18.000000Z 字数 1315 阅读 1376

大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序

杂项 计算机原理


概念剖析

一时记忆与理解大端小端的概念很容易,但时间一长,对于相似的概念人类的记忆向来是模糊的,甚至是换位的。所以除非你的记忆非常牢靠,否则借助大端小端这样的名字,你很难将概念与内容联系紧密。

也有文章提到用大尾小尾的概念,个人觉得这个概念还是没有解决存储概念中的基本问题,还是没有脱离以前的概念,但是引入了的概念,已经比大端与小端要更清晰一点。

目前对于记忆大小端,我觉得这篇文章中提到的高尾端/低尾端名词记忆方法比较科学、形象。实话说,当时计算机科学著作翻译Big EndianSmall Endian时,确实没有考虑中国人理解的问题,直译显得生硬,还未做到信达雅的境界。

刚才我们提到存储概念中的基本问题,其实就是两个:一是对于一个数据,如何标示它的头尾;二是头尾在内存中排列的顺序。基于这两个基本问题,我认为高尾端/低尾端这样的叫法是最科学,最贴近存储实情的。其中用于表示数据的尾端字节,如int型数据0x1122AABB0xBB即是就更好理解了,指的是存储地址的高低。综合来说就是:

高尾端:数据的尾端字节存储在内存的高地址。即头端字节存储在内存的低地址,数据依序增加存储。
低尾端:数据的尾端字节存储在内存的低地址。即头端字节存储在内存的高地址,数据依序递减存储。

从这两个概念中,我们可以发现,高尾端存储方式比较符合人类的直观思维方式,地址依序增加,数据依序从头端后移,两者呈完美的顺位对应。而低尾端这种方式很是别扭,显得很反人类。

因此,一般的网络通讯中,我们为了方便人类的习惯,采用高尾端传输方式,也就是大端方式。网络中数据流的传输顺序被称为网络字节序。由此对应一个概念就是主机字节序,也就是数据在主机中存储的方式。因此,在网络传输中,不同的主机有不同的字节序,传输前一定要转换成网络字节序,否则会引起数据传输的错误。


直观理解

上一小节中已经对于各种概念进行了描述,其中相应的关系也给出了,在实际工作中,大家还是习惯性的使用大小端的概念,刚才我也提到了,这种叫法不利于记忆与理解,因此推荐大家使用高尾端/低尾端的概念,两者之前的对应关系还是很明显的,甚至在不需要我说明的情况下,大家凭经验就可以知道高尾端对应大端低尾端对应小端

这一节主要细化这两个一一对应的概念,让大家有更直观的感受。

一般来说,计算机内存中都是以字节(Byte)为基本单位,那么对于一个int型数据,它在内存中的存储方式有两种,这就是大端存储小端存储。以上节数据0x1122AABB为例,假设存储在地址为0x91000000的内存处。很显然,它需要占用四个内存地址,从0x91000000-0x91000003

地址 0x91000000 0x91000001 0x91000002 0x91000003
大端 11 22 AA BB
小端 BB AA 22 11

很自然,大家会觉得大端存储方式符合人类的习惯,这种存储方式就是将数据的尾端字节存储在高地址。上面的描述倒是怪怪的。但不论怎么说,高尾端/低尾端方式包含了存储问题中的两个基本要点,只要稍加思维,就可以将概念与内容对应上来。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注