大小端字节序
在数据储存中:
数据低位 对 地址低位,称为小端模式;
数据高位 对 地址低位,称为大端模式。
STM32 单片机使用小端模式。
三个神秘代码
下面有三段代码,用于拆分 uint16_t 到 uint8_t,为了使用串口发送。
请分析 buf[1] 和 buf[2] 各是多少?
使用指针
uint16_t foo = 0x0066CCFF; uint8_t buf[8]; uint8_t *p = (uint8_t *)&foo; buf[1] = *p; buf[2] = *(p + 1);使用移位
uint16_t foo = 0x0066CCFF; uint8_t buf[8]; buf[1] = foo >> 8 & 0xFF; buf[2] = foo & 0xFF;使用 union 联合体
uint16_t foo = 0x0066CCFF; uint8_t buf[8]; enum { float u16; uint8_t u8[2]; } u16_to_u8; u16_to_u8.u16 = foo; buf[1] = u16_to_u8.u8[0]; buf[2] = u16_to_u8.u8[1];
答案是:只有 2 答案是固定的(buf[1] = 0x0066,buf[2] = 0xCCFF),而 1、3 都不一定。
大端和小端
小端模式的优势
小端模式在处理器中具有以下优势:
- 数据存储方式与内存地址的增长方向一致,便于解析和操作。
- 在多字节数据的数学运算中,低位字节的优先处理使得计算更加简单。
常见的大小端模式设备
- 小端模式:STM32、x86架构处理器、ARM(默认小端模式)。
- 大端模式:STM8、KEIL C51等。
需要注意的是,虽然 ARM 处理器可以支持大端模式,但 STM32 作为 ARM Cortex-M 系列的实现,默认工作在小端模式,且无法通过软件更改其字节序。