在计算机科学中,"端序"(Endianness)是指多字节数据类型(如整数或浮点数)在内存中的存储方式。主要分为两种:大端模式(Big-Endian)和小端模式(Little-Endian)。
大端模式 (Big-Endian)
在大端模式中,多字节数据类型的最高有效字节(MSB)被存储在最低的内存地址上,而最低有效字节(LSB)则被存储在最高的内存地址上。这种存储方式与人类通常读数的方式一致,因此有时也被认为是“自然”的顺序。
小端模式 (Little-Endian)
在小端模式中,情况正好相反,最低有效字节(LSB)被存储在最低的内存地址上,而最高有效字节(MSB)则被存储在最高的内存地址上。
举例说明
以一个16位无符号整数 0x1234
(十进制为4660)为例,来看一下在大端模式和小端模式下,它在内存中的布局:
大端模式
假设我们有一个支持大端模式的嵌入式系统,比如一个基于 ARM 的微控制器配置为大端模式。当我们将 0x1234
写入到内存时,它的存储方式如下:
- 内存地址:0x0000 | 0x0001
- 存储值: 0x12 | 0x34
高位字节 0x12
被存储在最低的地址 0x0000
上,而低位字节 0x34
则被存储在较高的地址 0x0001
上。
小端模式
现在假设我们有一个支持小端模式的嵌入式系统,例如一个 x86 架构的微控制器。当我们将 0x1234
写入到内存时,它的存储方式如下:
- 内存地址:0x0000 | 0x0001
- 存储值: 0x34 | 0x12
低位字节 0x34
被存储在最低的地址 0x0000
上,而高位字节 0x12
则被存储在较高的地址 0x0001
上。
实际应用
在嵌入式系统开发中,了解处理器的字节序是非常重要的,因为这直接影响到数据的处理和传输。例如,当你从串行接口接收数据时,如果你的处理器是小端模式的,而发送方是大端模式的,那么你可能需要在接收后重新排列字节的顺序才能正确解析数据。
如何判断大小端:
可以定义一个整数变量,并将其设置为一个特定的值,然后通过比较该值的低位字节来确定系统的字节序。
#include <stdio.h>
int main() {
// 定义一个整型变量,并给它赋一个特定的值
int testValue = 0x01020304;
// 使用 union 来访问整型变量的各个字节
union {
int asInt;
char asChar[4];
} byteUnion;
byteUnion.asInt = testValue;
// 检查最低位的字节
if (byteUnion.asChar[0] == 0x01) {
printf("This system is in Big-Endian mode.\n");
} else if (byteUnion.asChar[0] == 0x04) {
printf("This system is in Little-Endian mode.\n");
} else {
printf("Cannot determine endianness.\n");
}
return 0;
}