大端模式与小端模式

简介

在几乎所有的机器上,多字节对象都被存储为连续的字节序列例如在C语言中,一个类型为int的变量a地址为0x100对应地址表达式为&a的值为0x100。且a的四个字节将被存储在存储器的0x1000x1010x1020x103位置。

存储地址内的排序则有两个通用规则,即大端模式和小端模式。所谓“大端模式”,是指数据的高字节存储在高地址中,而数据的低字节存放在低地址中;所谓小端模式,是指数据的高字节存储在低地址中,而数据的低字节存放在高地址中。

高低字节

对于一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿0x12345678来说,从高位到低位的字节依次是0x120x340x560x78

/低地址

C程序映像中内存的空间布局如下:

最高内存地址为0xffffffff

栈底

             

栈顶

........

最低内存地址为0x00000000

如果我们在栈中分配一个unsigned char buf[4],那么这个数组变量在栈上的布局如下:

栈底(高地址)

buf[3]

buf[2]

buf[1]

buf[0]

栈顶(低地址)

总结:

对于局部变量:先定义的为高地址,后定义的为低地址;

对于结构体、数组先定义的为低地址,后定义的为高地址;

存储器格式

1.对于小端存储器系统

字数据的高字节存储在高地址中,而字数据的低字节存放在低地址中。

2.大端存储器系统

数据的高字节存储在内存的低地址中,而字数据的低字节存放在高地址中。

例如0x12345678在存储器中存放方式如下:

0x12345678 从高位到低位的字节依次是0x120x340x560x78

0x03 为高地址 0x00为低地址

地址偏移

大端模式

小端模式

0x00

12OP0

78OP3

0x01

34OP1

56OP2

0x02

56OP2

34OP1

0x03

78OP3

12OP0

OPO 表示一个32位数据的最高字节MSBMost Significant Byte),使用OP3表示一个32位数据最低字节LSBLeast 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");

 

你可能感兴趣的:(STM32学习笔记)