学过计组或者微机原理的同学应该都知道有一个东西叫字节序(或者叫大端存储和小端存储),这个是什么来的呢?其实是一个特简单的东西,但是却在很多时候让人头疼,为啥?且听我细细道来。后面我会提到这个东西为啥这么“恶心”
一、一句话概括字节序
字节序其实就是字节数据的表示顺序。
二、字节序到底有什么用?
字节序当然有用!比如数据在计算机中的存储,数据在网络中的传送。举个例子,我们都知道在计算机的世界中,其实只有1和0,但是对于人类这种高级动物来说,单纯的1和0显然不够用,那么人类世界的信息应该如何表示呢?也很简单,就是用比特流来表示,也就是一串常常的1和0。
好的,现在有两个问题,一个是当人类遇到一串比特流的时候应该如何解析翻译成人类语言?另一个是计算机应该如何存储这些比特流?
因此,为了方便解决上面两个问题,这里需要一个基础的约定,也就是这些比特流是有划分的单位的,也就是字节,一个字节表示几位比特。主要是计算机寄存器和cpu决定,一般而言,一个字节是8位(为什么是8?历史经验表示,8位对于计算机世界来说是一个友好的数字,字节是一个既面对人类又面对计算机本身的一个单位,当然要对计算机友好,否则计算机处理起来会非常麻烦)。也就是说,第一个约定是,比特流可以按照字节来划分,人类可以操纵的计算机存储的最小单位就是字节。换句话来说,人类处理二级制流是按照字节来划分然后处理的。
在使用字节的约定下,人类语言和计算机之间字节流之间的转换如何实现呢?一开始只考虑一些英文字母和标点符号以及一些想像空格和换行这样的符号,8位比特足够表示(ASCII编码),但是后来需要表示越来越多的符号了,因此只能用更多的字节来表示一个字符(如utf-8编码),(有兴趣可以参考我的这篇博客https://blog.csdn.net/ganzr/article/details/85780319)。同样在编程时,我们需要将一些人类世界中的数据类型用一到几个字节来表示。
问题又来了,在计算机中应该如何存储这些字节的顺序呢?也就是本文的主角字节序。
因此,我们需要一个约定,约定如下:
在人类的头脑理解中,我们习惯将字节流理解成高位字节和低位字节,从左到右表示从高到低。在计算机中,一般的存储方式是先从低地址位存储一个数据。因此我们约定,先存储字节流中的高位字节后存储低位字节的方式称作大端存储,反过来,先存储低位字节再存储高位字节的方式叫做小端存储。
相应的在网络数据传送中,先传送高位字节的称作大端传送,反之,先传送低位字节的称作小端传送。比如在ip协议中,就是用到大端传送。
三、为什么字节序会这么“麻烦“
首先,字节序这个东西本身就是联系计算机逻辑世界和人脑逻辑世界的一个“协议”,这种麻烦其实相当于两个世界之间的“沟通成本”。
其次,我们在理解字节序的时候,如果单纯用人脑思维去理解的话会显得这个东西略显笨拙,但是如果没有这个东西,人脑和电脑之间,电脑和电脑之间的信息交流将会困难重重甚至无法进行,(粤语中叫鸡同鸭讲)。也就是说不是这个东西难理解,而是你理解的方式不对!!!(推而广之,很多计算机中的东西是兼具计算机视角和人类视角的,单纯从哪一个角度去理解都会让你无法接触到本质)。
-----------------------------------------------------------------------------------------------------------------