目录
什么是大小端存储
首先我们先来熟悉一下其他的一些关于内存的知识,如果你对自己有足够的自信,请点击目录直接跳到下面的正文。
一:大小端的介绍:
我们知道,一个int类型的数据是4个字节,当数据为1的时候,其二进制码为00000000000000000000000000000001
那么这四个字节的内容在内存中的顺序是什么样的呢?
函数二进制位为1的那个字节是放在低地址出还是放在高地址处呢?
这就是大小端存储的问题:
大端存储就是低进制位的字节放在高地址处,高进制位的字节放在低地址处,如果是按照大端存储的话那么含有1的那个字节就会放在最右边的那个格子;
小端存储就是低进制位的字节放在低地址处,高进制位的字节放在高地址处,那么这样的话就是含有1的那个字节就会放在最左边的那个格子上。
存储的方式是按照大端还是小端的方式这个c语言标准是没有规定的,由不同的编译器来具体实现,下面就是两种判断大小端存储的方法(在vs2019环境下)。
二:判断当前的编译器环境的大小端存储
方法1:使用指针
我们都知道指针是存放地址的,如果定义一个整型指针指向一个整型变量的话,那么他存放的地址值就是其四个字节中的最低的地址值,然后步长就是接下来的4个字节。
那么,如果我们用字符型指针来指向一个整型变量的话,那么我们就可以只访问到其最低地址的一个字节。
当我们定义整型变量的值为1的时候,如果是大端存储,那么对指针进行解引用的话,得到的结果应该是0,如果是小端存储的时候,对其解引用的话得到的结果应该是1.
下面就让我们用代码来实现一下:
#include<stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;
if (*p == 1)
printf("当前是小端存储\n");
else printf("当前是大端存储\n");
}
在vs2019中跑出来的结果是小端存储,与预期结果是符合的,你们也可以试一试用不同的编译器来跑一跑这段代码。
方法2:利用联合体的特性来判断大小端的存储:
联合体的知识引论:首先我们知道联合体是可以将多个变量放到同一块区域的,如果联合体定义的是下面的情况:
union test
{
char a;
int b;
};
那么他们在内存中的情况应该是这样的:
那自然,我们还是可以把b定义成1,然后对a进行访问,得到存储的大小端结果:
#include<stdio.h>
union test
{
char a;
int b;
};
int main()
{
union test biancheng;
biancheng.b = 1;
if (biancheng.a == 1)
printf("当前环境是小端存储\n");
else printf("当前环境是打断存储\n");
}
很显然,这次在vs2019上的运行结果还是小端存储。
以上就是本期的全部内容,如果你觉得这篇文章对你有所启发的话,请多多点赞收藏加转发,你们的支持就是我前进的动力(一个赞一道题)!!!!!