大端小端系统
背景
大端小端系统,也就是Big-Endian和Little-Endian系统。属于一个基础概念,这里补充记录一下。
理论
整数在内存的一系列连续字节中存储为二进制值,通常存储为2、4、8或16字节。字节采用什么顺序是非常重要的。
以下以十进制整数262657存储为4字节二进制值为例。
选择这个值是因为它的二进制值每个字节的位模式都很容易与其他字节的内容区分开。
如下所示:
1 | 十进制数 262657 |
Little-Endian
对于使用Intel处理器的PC,十进制数262657就存储为如下形式。
1 | 字节地址: 00 01 02 03 |
可以看出,值中最高位的8位是都为0的那些位,它们都存储在地址最高的字节中,换言之,就是最右边的字节。最低位的8位存储在地址最低的字节中,即最左边的字节。这种安排形式就是Little-Endian。
那么为什么计算机会颠倒这些字节的顺序?
这么设计的动机在于实现更高效的计算和更简单的硬件。具体细节不重要,重要的是应该知道,如今的大部分现代计算机都使用这种与直觉相反的编码方法。
Big-Endian
虽然大部分计算机都采用小端编码方法,也有一部分例外情况。
对于使用Motorola处理器的机器,十进制数262657就存储为如下形式。
1 | 字节地址: 00 01 02 03 |
可以看出,这种在内存中的存储更加符合逻辑。
字节现在的顺序是反的,最重要的8位存储在最左边的字节中,即地址最低的字节。这种安排形式就是Big-Endian。
一些处理器,例如Power-PC处理器以及所有近来生产的ARM处理器,采用的都是Big-Endian系统。
为什么需要关注大端小端系统?
数据的字节顺序是可以在Big-Endian和Little-Endian之间切换的。
注意:
无论字节顺序是Big-Endian还是Little-Endian,在每个字节中,最高位都放在左边,最低位都放在右边。
那么为什么需要关注大端小端编码呢?
实际上,在大多情况下,即使不知道执行代码的计算机是采用Big-Endian还是Little-Endian系统,都可以编写出有效的C++程序。但是,在处理来自另一台机器的二进制数据时,这就很重要了。二进制数据会写入文件或通过网络传送为一系列字节,此时必须解释它们。如果数据源所在的机器使用的字节顺序与运行代码的机器不同,就必须反转每个二进制数据的字节顺序,否则就会出错。