嵌入式快充:内存大小端

一、大小端概念

目前大多数计算机中,存储的基本单元是一个字节,对应着8位长度,当存储8位以上的单元,比如:字(16位)、双字(32位)时,他们是拆分成8位进行存储的,因为存储空间是一个连续的地址,如果我们要存储一个16进制的数,他可以分为高8位字节和低8位字节数据,如果高8位字节的数据放在高地址,低位8位数据放在低地址,为小端存储,相反如果高8位数据放在低地址,低8位数据放在高地址,则为大端存储,具体可以由下图表示:

大小端

二、使用C判断当前机器大小端

使用C语言判断大小端,我们可以先定义一个16位的已知数据,使用一个char指针强制指向已知数据的地址(指向的是低地址),然后我们以16进制打印指针指向地址的数据

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(void)
{
unsigned short u16;
unsigned char* u8;
u16 = 0x1234;
u8 = (unsigned char*)&u16;
printf("%x",*u8);
return 0;
}

运行后结果如下

20210802225217

可以看到打印的是0x34,对应的是0x1234的低地址数据,所以当前计算机的存储方式为小端存储

wechat