单片机-大端与小端储存模式解析

首先简单说一下所谓的“大端”以及“小端”的含义,其实大端与小端其实是指由于处理器寄存器宽度不同,造成储存上的方式差异。"中心思想"是数据高低位数据存储的高低地址位置不同。小端是数据高字节存储在内存的高地址上,数据低字节存储在内存的低地址上。大端是数据的高字节存储在内存的低地址上,数据低字节存储在内存的高字节上。

网上比较专业的解释如下:
小端:较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址。
大端:较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址

下面是我觉得讲的最通俗的例子:

/******************************************华丽的分界线*********************************************/

例1:

STM32 属于小端模式,简单地说:比如:temp=0X12345678;假设temp的地址为:0X4000 0000
那么,在内存里面,其存储就变成了:
|       地址   |    HEX   |
|0X4000 0000    |78 56 43 12|

更为简单一点:
低地址---------->高地址【大端模式】
0X12|0X34|0X56|0X78|
低地址---------->高地址【小端模式】
0X78|0X56|0X34|0X12|

 

例2:

数组在大端小端情况下的存储:
以unsigned int value = 0x12345678为例,
分别看看在两种字节序下其存储情况,
我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下:
高地址
       ---------------
       buf[3] (0x78) -- 低位
       buf[2] (0x56)
       buf[1] (0x34)
       buf[0] (0x12) -- 高位
       ---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
       ---------------
       buf[3] (0x12) -- 高位
       buf[2] (0x34)
       buf[1] (0x56)
       buf[0] (0x78) -- 低位
       --------------
低地址

原因说明如下:

为何会出现大小端之分:
这是因为在计算机系统中,我们是以字节为单位的,
每个地址单元都对应着一个字节,一个字节为8bit。
但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),
另外,对于位数大于8位的处理器,例如16位或者32位的处理器,
由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。
因此就导致了大端存储模式和小端存储模式。
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,
那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,
0x22放在高地址中,即0x0011中。小端模式,刚好相反。
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。
很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

/******************************************华丽的分界线*********************************************/

弄个简单测试,平台基于STM32F103VET6芯片,测试内容用char 类型变量转存 int 类型 高低字节数据,然后串口打印出来;

测试代码:

//大小端测试函数
void cpu_endian_func(void)
{
    int  data    = 0x1122;             //整形数据
    char Lowaddr = 0;                  //低字节存储变量
    char Highaddr= 0;                  //高字节存储变量

//数据转存
  Lowaddr  = ((char*)&data)[0];    //取data低字节
  Highaddr = ((char*)&data)[1];    //取data高字节
  printf("Lowaddr:%x  Highaddr:%x\r\n",Lowaddr,Highaddr);                         

}

int main(viod)
{

   peripherals_init();   //底层驱动初始化(驱动包含系统时钟、串口等,可根据自己硬件而定)
   cpu_endian_func();

}

测试结果:

单片机-大端与小端储存模式解析_第1张图片

分析结果:说明STM32属于小端储存模式。

其实这两种大端、小端存储模式更多的是在制定通信协议的时候,因为像ARM这样的单片机完全可以通过大小端转化处理进行数据处理的(也就是通过数据移位获得高低位数据)。个人觉得在实际的应用中,最主要还是了解大端与小端的含义,懂得进行数据处理即可。

以上相关例子引自:http://www.51hei.com/bbs/dpj-40275-1.html

你可能感兴趣的:(单片机篇)