对于字节顺序——大端与小端的理解

Posted 子衿时代

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于字节顺序——大端与小端的理解相关的知识,希望对你有一定的参考价值。

之前我对大小端的理解是数据存放方式不同,最近在读《计算机组成-结构化方法》一书时发现,并不是存放方式不同,而是字节地址的编排方式不同,换句话说,存的位置都是一样的,只不过这个位置因为编址方式的不同使得它的地址编号不同,也因此产生了大小端问题。下面的理解均是我个人对于《计算机组成-结构化方法》第六版2.2.3节的理解,建议大家看原书。
首先,大端与小端这两个名词出自英国作家Jonathan Swift,他在《格列夫游记》一书中将这两个词用来讽刺那些因为争论打鸡蛋时应该打破大端还是小端而引发一场战争的政治家们。
每八位存储单元组成了一个字节,一定数量的字节组成字,这个一定数量由处理器决定,如果是32位处理器,那么一个字(32位字)就是4字节,64位处理器,一个字(64位字)是8字节。每个字中的字节地址可以从左到右或从右到左编排。如图a,是从左到右排列(大端),图b是从右到左排列(小端)。

不管是大端还是小端,用来表示一个32位整数时,比如说6,都是在最右边的(最低位)3位上存放6的二进制值110,前面的29位都是0,换句话说,在大端派的计算机中,有110这三位的应该是字节3(或者是7、11、15),而在小端派计算机中是字节0(或者是4、8、12)中。
如果计算机只用来存放整数,那么不会有任何问题。然而,许多应用中要存放的是整数、字符串和其他数据类型的混合结构。例如,我们要在计算机中存放一个由一个字符串(名字)和两个整数(年龄和编号)组成的简单的员工记录。如图a、b分别给出了用大端派和小端派计算机表示同一个员工Jim Smith(年龄21、编号260)的不同存储方式。

两种表示方式都没有问题,但是当一台计算机要从网络上向另一台计算机发送这个数据时,就有问题了。嘉定从大端派计算机向小端派发送上面的数据,每次一个字节,从字节0一直到字节19。即大端派的字节0送到小端派的字节0,一次下去。如图c

对比图b会发现数据出错了,名称没有问题,但是年龄和编号变了,换句话说传输过程中按照字节对应传输,对于字符串没有问题,但是对于年龄和编号等整数就不对了。如果只是简单的将传递过来的数据反转,将会出现图d的情况。

对比图b发现,年龄和编号对了,但是名称会变成"MIJTIMS",最后的"H"会因为前面的0而无法输出。这个问题没有简单的解决办法。可行但不太全面的一条途径是在每个数据项前面加上一个头来描述其后的数据类型和数据长度,使接收方可对数据进行必要的转换。

以上是关于对于字节顺序——大端与小端的理解的主要内容,如果未能解决你的问题,请参考以下文章

大端模式与小端模式的理解以及判断方法

大端字节顺序和小端字节顺序有啥区别

腾讯程序员面试题2(转)

数据在内存中存储的方式:大端模式与小端模式

字节序

大端和小端(big endian little endian)