关于大端、小端的理解
关于大端、小端的理解
Persus & Xie
在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但在C语言 中,除了8bit的char类型外,也有32bit的float型,64bit的double型(要看具体的编译器),另外,对于位数(bit)大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,所以存在一个问题:如何安排多个字节。故,存在两种模式来解决这个问题:大端存储模式和小端存储模式。
低位与高位
在我们的书写习惯中,通常自左向右书写一个数字,比如31415926,其中3
是是最高有效位,6
为最低有效位。计算机内存中一个字节的位数相当于二进制数的位数,相当于最最低有效位表示1
,倒数第二个有效位表示或2,倒数第三个有效位表示或者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 |
总结
本文通过从介绍低位
与高位
到进一步解释了关于大端和小端的相关理论。