目录
开门见山的说:
大端小端是一种数据存储模式,我们都知道地址吧,内存中地址由低到高递增
大端(存储)模式,是指数据的低位,保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式,是指数据的低位,保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
是不是还有点不理解,直接上实例分析
#include<stdio.h>
int main()
{
int x = 0x44332211;
printf("%p", &x);
//定义一个十六进制数。
return 0;
}
实例分析:
这里我定义了个16进制数,44332211,我们知道44的位数是高于11的,就和十进制中1000和1的位数对比一样。
如果是大端储存的话,低位也就是1,保存在内存的高地址中,高位就是4,保存在内存的低地址中。
如果是小端储存的话,低位1,保存在内存的低地址中,高位4,保存在内存的高地址中。
是不是清晰很多啦?
我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。
很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端
vs2019储存模式
小端模式↓
典型小端存储。
判断大端还是小端:
int arr()
{
int i = 1;
return (*(char*)&i);
}
#include<stdio.h>
int main()
{
int x =arr();
if (x== 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
让我们看看这个很巧妙的代码的判断核心。
(*(char*)&i);
&i取出i的在内存中的地址,int型为4个字节
如果是小端储存
【 1000】【 0000】【 000】【 0000】
如果是大端储存
【 0000】【 0000】【 000】【 0001】
然后使用强制类型转换char* ,char指针只能取出一个字节的值!!!
再对这一个字节进行解引用!
小端储存【 1000】=1
大端储存【 0000】=0
那么return的值,就会根据大端/小端的差异发生变化,如果是小端的话这个值肯定是1.
判断大小端就如探囊取物一般。
顺便一提这是百度2015年的面试题之一。
第二种方法共用体判断:
int arr()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
#include<stdio.h>
int main()
{
int x =arr();
if (x== 1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
让我们看看这个很巧妙的代码的判断核心。
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;由于共用体的特性i与c共用一块内存
但i为int 型占四个字节,c为char型1个字节;
如果是小端储存
【 1000】【 0000】【 000】【 0000】
如果是大端储存
【 0000】【 0000】【 000】【 0001】
c取的值,就和小端还是大端存储有着直接关系了!
小端便是取的【 1000】
大端便是取的【 0000】
判断结果也就显而易见了
哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞吧
Thanks♪(・ω・)ノ
(期待一下,要是有分享和收藏更好啦)