理解大端和小端(big-endian & little endian)这两类字节序,有个新解释。数字的表示,或者扩大到信息的表示,其目标不外乎两类,描述和操作:
- 描述:不需要改变原始信息,是一个从粗到细的逐步细化的理解过程;
- 操作:可能改变原始信息,操作过程需要从细微处逐步积累对整体的影响。
一个最最简单的例子就是我们读写阿拉伯数字,都是大数位在前,小数位在后,这属于大端情形,但在进行竖式计算(加减乘)时,却是右对齐,先考虑小数位,再逐步扩展至大数位。
描述一个数字,从大到小的数位顺序可以让人逐步细化理解,比如房价 31450/平方,当读出 3w 时,人心里自然会有一个感性的认知和心理预期,这房子要 3w 多,然后听到 1k 后会觉得并不比 3w 多多少,毕竟 3w9k 也是 3w 多,比 3w1k 多多了,后面的就属精打细算了,能不能不抹零换个 iPhone 的事。反过来,如果先说 50 块,购房者得不到任何有意义信息,即使他听到 3w 时他也不知道后面会不会还有数字,所以这种从小数位到大数位的计数法需要一个休止符,很麻烦。
但计算就不一样,1x + 3y 中的 x,y 是 0 还是 9 对结果影响非常大,40 和 58 的区别,而 1 和 3 在没有计算得到最终结果前,只能估摸一个近乎同等数量级非常粗糙的范围。
除法为什么特殊?因为除法并不影响整体结果,换句话说,除法的商只是人们心中的一个抽象,它只是一个切割方法,并不自然存在。
除了数字,其它信息也一样,比如我们看到英文 pro-,for- 前缀,或看到中文 “提手旁”,“单人旁”,大概就知道后面这个词的描述范围,后面那些东西都是在逐步细化。
这么理解计算机领域的大端和小端就很容易了。
不可否认存在一些偶然随机因素导致早期的计算机都倾向于大端字节序,随之的网络传输也继承了它,但大端字节序确实符合人的习惯,就像我们手写数字一样。但对于计算,小端字节序或许更加适合,正如我们做竖式乘法时右对齐一样。
和早期简单通信,集中计算模式不同,PC 时代过多的本地渲染需要更频繁的散装运算,计算机技术迅猛发展的兼容性需求引发更频繁的强制类型转换,小端机 “恰好” 做这些更加高效。但即便大端机全被淘汰,考虑到兼容性,网络大端字节序已经成了事实标准。
不管怎样,在整个计算机网络领域,描述性字节序和操作性字节序算是各归其位了,网络协议是纯描述性的,而端主机计算则属于操作性,它们的字节序表示都适合自己的语义,加一道转换也不多。
浙江温州皮鞋湿,下雨进水不会胖。