关于字节序的科普 主机序、网络序,通过调试器,直接观察

计算机领域历史原因形成的某些设计习惯,跟马屁股宽度决定火箭推进器宽度的道理是一样的,没必要硬去分析里面的“优势”“劣势”,纯粹只是历史习惯。

原文链接

作者:北极 链接:https://www.zhihu.com/question/637413724/answer/3346032134 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

正文转载

现如今的大小端状况,是历史习惯+商业化的结果,跟技术本身关系不大。ARM 可以设置成大端也可以设置成小端。TCP/IP 头至今仍然是大端(网络字节序)。存储领域也有很多存储协议/规范以大端方式保存数据。

所以题主的三个问题,在今天看来:

  • 计算机为什么普遍采用小端存储?–> 不正确。
  • 为什么低字节存储在低地址的小端方式比大端方式效率更高? –> 效率并不会更高。

任何以当前技术来论证这三个问题的,都属于先射箭后画靶子的行为。


但是如果说大端或者小端的选择,在计算机发展历史上,确实是有一定客观因素的:主机字节序(小端)的优势:小端的加法器比较好做,如果做一个8位*4的加法器,只需要一个8位加法器,然后依次从低到高循环加上所有字节就可以了,进位的电路非常简单,而如果是大端,则需要一次加载32位,否则无法进行计算。现在来看,一次加载8位还是32位,区别不大,但是在几十年前,存储器的价格昂贵,自然是越简单越好,所以主机字节序选择小端是基于成本的考虑。网络字节序(大端)的优势:早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地址范围(IP地址是从前到后匹配的)。早年的网络设备的缓存都是以字节为单位的,先取高字节确实是会更快一些。所以网络设备使用大端,也是基于成本的考虑。


所以,字节序的选择,在历史上,大多数是应用场景和成本的考虑更多(比如:PPC/MIPS更适合做网络设备),而后来的技术发展过程中,由于兼容性的原因,大小端的配置沿用至今。

在今天看来,这些优势已经完全不存在了,仅仅只是历史习惯。