- 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
- 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
简单来说,就是:
- 小端——低地址存储低位,高地址存储高位
- 大端——低地址存储高位,高地址存储低位
判断原理:
使用char指针,或者联合体,读取一段内存中的当前字节(8比特)数据,和下一个字节数据,由于读取内存时,都是从低地址往高地址读取数据。所以读取到的第一个字节数据是低地址的,第二个数据是高地址的。
通过比较这两个数据,就能判断是大端小端
示例程序:
使用了两种方法:char类型指针和联合体
#include<stdio.h>
#include <stdbool.h>
union Utest
{
short num;
char c;
}Utest;
int main(void)
{
// printf("%d\n",sizeof(1==1));
short i = 0x1122;
char* a = (char *)(&i);
printf("%p\n",a);//低地址
printf("%x\n",*a);//22,低位
printf("%p\n",(a+1));//高地址
printf("%x\n",*(a+1));//11,高位
//说明是小端
union Utest u;
u.num = 0x5566;
printf("%x\n",u.c);//66,66是低位,读取内存时,是从低地址到高地址
//低地址中存储的是地位,因此是小端
return 0;
}
在win10+VS2017+x64环境下结果:
00000095382FF774
22
00000095382FF775
11
66
在Ubuntu20.04+gcc9.3.0环境下结果:
0x7ffc8badffcc
22
0x7ffc8badffcd
11
66
可见都是低地址存储了数据的低位,因此是小端模式。
参考文章: