单片机和C语言中的一些通用知识:(二)大端和小端
| 上一篇 | 下一篇 |
|---|---|
| 时间复杂度 O(1) 和 O(n) |
大端和小端
大端(Big-Endian)和小端(Little-Endian)是两种不同的字节序(Endianness),用于定义多字节数据(如 16 位、32 位整数或浮点数)在计算机内存中的存储顺序。它们的区别核心在于:数据的 “高位字节” 和 “低位字节” 在内存中存放的先后顺序不同。
首先,我们要了解三个概念:
- 高位字节 (High-order byte):指一个数值中权重最高的字节,即最左边的字节。
- 低位字节 (Low-order byte):指一个数值中权重最低的字节,即最右边的字节。
- 内存地址:内存是由一系列连续的地址组成的,地址从低到高排列(
0x00、0x01)。
1)区别
-
大端模式:
-
规则:“高位字节存放在低地址,低位字节存放在高地址”。
-
记忆口诀:高低低高(高位 -> 低地址,低位 -> 高地址)。
-
特点:
-
数据在内存中的排列顺序与人类书写习惯一致(从左到右,从高到低)。
-
常用于网络协议(如 TCP/IP 中的“网络字节序”就是大端)、某些处理器架构(如 PowerPC, SPARC, MIPS 的部分模式)。
-
-
-
小端模式:
-
规则:“低位字节存放在低地址,高位字节存放在高地址”。
-
记忆口诀:低低高高(低位 -> 低地址,高位 -> 高地址)。
-
特点:
-
数据在内存中的排列顺序与人类书写习惯相反。
-
这种方式便于 CPU 从低地址开始逐字节读取数据时,能快速获取到数值的低位部分,对于加法等运算有潜在优势。
-
广泛应用于 x86/x64 架构的 PC、以及 绝大多数 ARM 处理器(ARM 支持大小端,但通常配置为小端)。
-
-
-
记忆诀窍:
- 大端:“大”对应“高”,所以 高位字节 放在 低地址(开头)。
- 小端:“小”对应“低”,所以 低位字节 放在 低地址(开头)。
2)示例
假设我们有一个 32 位(4 字节)的十六进制数:0x12345678,其中:
0x12是最高位字节(权重最大)0x78是最低位字节(权重最小)
现在,我们要把这个数存储在内存中,起始地址为 0x1000。那么两种模式下的存储情况分别为:
大端模式:
| 内存地址 | 存储的数据 |
|---|---|
0x1000 | 0x12 |
0x1001 | 0x34 |
0x1002 | 0x56 |
0x1003 | 0x78 |
小端模式:
| 内存地址 | 存储的数据 |
|---|---|
0x1000 | 0x78 |
0x1001 | 0x56 |
0x1002 | 0x34 |
0x1003 | 0x12 |
3)了解的重要性
- 跨平台数据交换:
- 当两台使用不同字节序的设备通过网络或文件交换数据时,如果不对字节序进行转换,接收到的数据就会被错误解读。
- 因此,网络协议(如 IP、TCP)规定使用大端序(网络字节序),发送方如果是小端机器,需要调用
htonl()/htons()等函数将数据转换为网络字节序,接收方再用ntohl()/ntohs()转换回来。
- 嵌入式开发和调试:
- 在查看内存 dump 或调试变量时,了解目标处理器的字节序对于正确解析数据至关重要。
- 某些硬件外设可能要求特定的字节序。
- 联合体 (union) 和类型转换:
- 在 C 语言中,利用
union或指针强制类型转换来“拆解”多字节数时,结果会直接受字节序影响。
- 在 C 语言中,利用
