在大多数微处理器架构中,在一个地址单元仅存储一个字节(8bit)的数据。大部分的数据类型(比如uint16、uint32、string等)在存储时,需要拆分为单个字节存放在连续的地址单元中。
当存放多个字节数据时,字节的顺序和地址单元的增长方向,会存在两种不同的标准。
小段模式(Little Endian)
小段模式(Little Endian),也称为Intel顺序。最低有效字节,首先存储。
例如:int16数据0x1234在地址单元中的存储顺序为
地址 | +0 | +1 |
---|---|---|
内容 | 0x34 | 0x12 |
例如:int32数据0x57415244在地址单元中的存储顺序为
地址 | +0 | +1 | +2 | +3 |
---|---|---|---|---|
内容 | 0x44 | 0x52 | 0x41 | 0x57 |
大端模式(Big Endian)
大端模式(Big Endian),也称为Motorola顺序。最高有效字节,首先存储。
例如:int16数据0x1234在地址单元中的存储顺序为
地址 | +0 | +1 |
---|---|---|
内容 | 0x12 | 0x34 |
例如:int32数据0x004A4F4E在地址单元中的存储顺序为
地址 | +0 | +1 | +2 | +3 |
---|---|---|---|---|
内容 | 0x00 | 0x4A | 0x4F | 0x4E |
C51使用大端模式
C51编译器中使用标准的C语言数据类型时(int, long等),使用大端模式;
STM32使用小段模式
STM32编译器,默认使用小段模式;
使用代码验证大小端模式
可以使用以下代码验证编译器使用的是哪种模式:
char x0,x1;
uint16 value = 0x1234;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
/* 如果x0 = 0x34,编译器为小端模式 */
/* 如果x0 = 0x12,编译器为大端模式 */