简介
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量a地址为0x100对应地址表达式为&a的值为0x100。且a的四个字节将被存储在存储器的0x100,0x101,0x102,0x103位置。
而存储地址内的排序则有两个通用规则,即大端模式和小端模式。所谓“大端模式”,是指数据的高字节存储在高地址中,而数据的低字节存放在低地址中;所谓“小端模式”,是指数据的高字节存储在低地址中,而数据的低字节存放在高地址中。
高低字节
对于一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高/低地址
C程序映像中内存的空间布局如下:
最高内存地址为0xffffffff
栈底
栈
栈顶
........
最低内存地址为0x00000000
如果我们在栈中分配一个unsigned char buf[4],那么这个数组变量在栈上的布局如下:
栈底(高地址)
buf[3]
buf[2]
buf[1]
buf[0]
栈顶(低地址)
总结:
对于局部变量:先定义的为高地址,后定义的为低地址;
对于结构体、数组先定义的为低地址,后定义的为高地址;
存储器格式
1.对于小端存储器系统
字数据的高字节存储在高地址中,而字数据的低字节存放在低地址中。
2.大端存储器系统
数据的高字节存储在内存的低地址中,而字数据的低字节存放在高地址中。
例如0x12345678在存储器中存放方式如下:
0x12345678 从高位到低位的字节依次是0x12、0x34、0x56和0x78。
0x03 为高地址 0x00为低地址
地址偏移 | 大端模式 | 小端模式 |
0x00 | 12(OP0) | 78(OP3) |
0x01 | 34(OP1) | 56(OP2) |
0x02 | 56(OP2) | 34(OP1) |
0x03 | 78(OP3) | 12(OP0) |
OPO 表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。
使用stm32做实验操作flash
16bit宽的数0x1234,假设从地址0x4000开始存放:
内存地址 存放内容
0x4001 0x12
0x4000 0x34
Cortex-M3是小端模式
如何判别当前系统为大端模式还是小端模式呢?
INT32U i = 0x12345678;
INT8U *p = (INT8U*)(&i);
if(p[0]==0x12)
printf("Big_endian");
else
printf("Little_endian");