大小端存储,即“大(小)端字节序存储模式”,是指数据存储在内存中的方式。
大端存储模式:指数据的低位储存在内存的高地址中,数据的高位储存在内存的底地址中。
小端存储模式:指数据的低位储存在内存的底地址中,数据的高位储存在内存的高地址中。
· 一般以小端存储模式较多
话不多说,上实例:
这里我们用int类型数据来举例
#include<stdio.h>
int main()
{
int a = 20;
int *p = &a;//取出a的地址
return 0;
}
当我们在监视窗口找到a的地址后,就可以将a的地址输入进地址中:
这里我们发现a的地址里存储的是 14 00 00 00这样的数字,那么为什么呢?
a的值为20,将其转化为二进制即为:
00000000 00000000 00000000 00010100
再进行十六进制转换:
0x 00 00 00 14
这样我们就得到了a的十六进制序列,发现与程序中数字对上了,但是位置不对,此时我们引入一个知识点:内存条中的地址从左到右依次升高,即左底右高
对于我们得到的十六进制序列来说,00 00 00 14的左边是高位,右边是低位(可以根据数字的权重来判断);
在内存条中,最低位存储在了最低的地址当中,所以我们可以分析得出,此时的数据低位存储在了低地址中,高位存储在了高地址中,即为小端存储;
大端存储同理,我们不再多过多赘述。
本文关于大小端存储的概念到这里已经结束,有兴趣的朋友可以看一下如下的例程:
如何判断一个机器的存储方式?
如果我们需要用一个程序判断一个电脑到底是大端存储还是小端存储的话,应该怎么做呢?
从常理出发,我们需要去创建一个数据类型,观察这个数据类型在内存中的存储方式,根据高低位在内存中的位置判断,好,理论存在,开始实践:
假设我们创造了一个int型数据a = 1,那么a的二进制我们可以简单得出:
00000000 00000000 00000000 00000001
转化为十六进制则为:
0x00 00 00 01
我们可以看出,a的最低位是01,最高位00,那么我们只需要观察一下在内存中的最低位到底是1还是0,若我们得出内存中的低地址为1,则证明了数据的低位存储在了低地址中,即为小端存储;反之则为大端存储。
接下来直接上例程:
#include<stdio.h>
int chek_sys()
{
int a = 1;//创建所需要的数据
return *(char*)&a;//&a是取出a的地址
//(char*)是强制类型转换a(整型)为字符型
// 即完成了“只观察a的首地址处数据”
//再解引用来将首地址处的地址转化为整形信息
// 00——0 01——1
}
int main()
{
int ret = chek_sys();//用这个函数判断
if(ret = 1)
printf("小端");
else
printf("大端");
return 0;
}
这样一个简单的判断例程就完成了,本文也到此为止,感谢您的观看,望不吝赐教,指出文章中的不足,~~~~~~~~~~~不要忘了点赞加关注,学c不迷路~~~~~~~~~~~