关于大端、小端的理解

关于大端、小端的理解


Persus & Xie

在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节8bit。但在C语言 中,除了8bitchar类型外,也有32bitfloat型,64bitdouble型(要看具体的编译器),另外,对于位数(bit)大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,所以存在一个问题:如何安排多个字节。故,存在两种模式来解决这个问题:大端存储模式小端存储模式

低位与高位

在我们的书写习惯中,通常自左向右书写一个数字,比如31415926,其中3是是最高有效位,6为最低有效位。计算机内存中一个字节的位数相当于二进制数的位数,相当于最最低有效位表示1,倒数第二个有效位表示2×12 \times 1或2,倒数第三个有效位表示2×2×12 \times 2 \times 1或者4;以此类推,如果一个用内存中的两个字节表示一个16位的数字,那么其中一个字节应该存放在最低的8位有效位,而另一个字节将存放在最高的8位有效位,如下图所示。存放最低的8位有效位的字节被称为最低有效位字节低位字节,而存放最高的8位有效位的字节被称为最高有效位字节高位字节

关于大端、小端的理解

一个16位的数占两个字节的存储空间,即高位字节和低位字节(见上图)。如果是在纸上书写一个16位的数,你总是会把高位字节写在前面,而把低位字节写在后面。然而,当这个数被存储到内存中时**,并没有固定的存储顺序**。

如果用H和L分别表示高位字节和低位字节,那么可以有两种方式把这两个字节存储到内存中,即H在前L在后或者L在前H在后。把M存储在前的顺序被称为“正向(forward)”或“高位优先顺序;把L存储在前的顺序被称为“逆向”或“低位优先”顺序。

大端和小端

大端Big-Endian)的定义:

把一个数的低位字节序的内容存放到高地址端,高位字节序的内容存放在低地址端

小端Little-Endian)的定义:

把一个数的高位字节序的内容存放到高地址端,低位字节序的内容存放在低地址端

我们用一个例子来区分大端和小端,我们有一个数字0x12 34 56 78,它在内存中的表示方式为:


  • 大端模式

    低地址-------------->高地址

    0x12 | 0x34 | 0x56 | 0x78


  • 小端模式**

    低地址端-------------->高地址端

    0x78 | 0x56 | 0x34 | 0x12


另外一个例子,对于一个16bit宽的数字0x1024在大端模式和小端模式下CPU的存放方式,假设存储位置起始为x1001,则其可以表示为:

内存地址 小端模式存放内容 大端模式存放内容
0x1001 0x24 0x10
0x1002 0x10 0x24

对于一个32bit宽的数字0x12345678在大端模式和小端模式下CPU的存放方式,假设存储位置起始为x1001,则其可以表示为:

内存地址 小端模式存放内容 大端模式存放内容
0x1001 0x78 0x12
0x1002 0x56 0x34
0x1003 0x34 0x56
0x1004 0x12 0x78

总结

本文通过从介绍低位高位到进一步解释了关于大端和小端的相关理论。