大小端字节序
在数据储存中:
-
数据低位 对 地址低位,称为小端模式;
-
数据高位 对 地址低位,称为大端模式。
STM32 单片机使用小端模式。
引入
有下面代码,问输出是多少
union u8_u16
{
uint8_t a[3];
uint16_t b;
};
u8_u16 test;
test.b = 0x66CCFF;
printf("%x,%x,%x", test.a[0], test.a[1], test.a[2]);
上面代码,涉及到了计算机储存数据的方式。答案是不一定。
- 如果储存顺序是:
高地址 | 中地址 | 低地址 |
---|---|---|
0x66 | 0xCC | 0xFF |
那么 a[0] == 0x66,a[1] == 0xCC,a[2] == 0xFF
- 但如果是:
高地址 | 中地址 | 低地址 |
---|---|---|
0xFF | 0xCC | 0x66 |
那么 a[0] == 0xFF,a[1] == 0xCC,a[2] == 0x66
在 0x11FF 中,11 是 “高位”,FF 是 “低位”。
第一种,数据低位 对 地址低位,称为小端模式。第二种,数据高位 对 地址低位,称为大端模式。
大端和小端
小端模式的优势
小端模式在处理器中具有以下优势:
- 数据存储方式与内存地址的增长方向一致,便于解析和操作。
- 在多字节数据的数学运算中,低位字节的优先处理使得计算更加简单。
常见的大小端模式设备
- 小端模式:STM32、x86架构处理器、ARM(默认小端模式)。
- 大端模式:STM8、KEIL C51等。
需要注意的是,虽然 ARM 处理器可以支持大端模式,但 STM32 作为 ARM Cortex-M 系列的实现,默认工作在小端模式,且无法通过软件更改其字节序。
应用场景
跨平台通信中,网络协议常用大端,需要进行字节序转换。STM32 在网络通信,常需通过移位运算实现大端。
STM32 处理器采用小端模式,这种模式在嵌入式中非常常见,尤其是在 ARM 架构的设备中。