大小端解释以及如何使用程序判断IDE的存储模式

今天让我们来了解一下大小端的概念吧

什么是大小端?

大端(存储)模式:指的是数据的低位保存在内存的高地址处,而数据的高位则保存在内存的低地址处。

小端(存储)模式:指的是数据的低位保存在内存的低地址 处,而数据的高位 则保存在内存的高地址处。

我们使用画图来给大家解释一下

大端

我们来看看这个图,数据使用16进制的方式储存,当我们开辟出内存空间的地址之后,图中从左到右是低地址到高地址,我们按照大端存储方式存储数据的时候会将高位存储在低地址处,低位存储在高地址处,这样我们看数据由低地址到高地址就是和原数据一样的顺序。

小端

我们再来看看小端存储模式,与大端存储不一样的地方是,唉,大家发现存储的数据反过来了,对的,这就是小端存储模式,他将我们低位的数据存储在内存的低地址,高位的数据存储在内存的高地址,这样我们在内存中看数据就会产生数据是倒着的感觉。

vs2022中的存储模式

好啦,了解了大小端之后,大家是不是有点好奇我们使用的IDE是使用的哪种存储方式呢,我们打开vs2022,创造一个整型变量a来看看吧。

通过调试,我们调出a的内存,可以看到在内存中a的存储是01 00 00 00,它的低地址01 存储在了内存的低地址上,所以我们vs2022IDE环境中使用的是小端存储方式。

内存改为一列就可以更清晰的看到,在地址0x00DEFE60中是01,0x00DEFE61中是00,01是数据的低位,存储在了低地址中,这样是不是就清晰明了了。

使用代码判断IDE的存储模式

现在我们尝试使用一个代码来判断我们的IDE环境是大端存储方式还是小端存储方式吧

代码展示

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int a = 1;
	char* p = (char*)&a;
	if (*p == 1)
	{
	    printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

代码解析

我们知道了大小端的概念之后就很容易写出判断大小端的代码了,我们首先定义一个变量a,之后我们只需要取内存中第一个字节来判断,如果内存中第一个字节是00,那么这个环境是大端存储方式,如果第一个字节是01,那么这个环境是小端存储方式。

我们如何在一个整型数据中准确找出他的第一个字节的数字呢,我们只需要将a强制转化成char类型就好,我们通过指针的方式,我们首先定义一个char类型的指针变量p,在指针p中存放char类型指针a的内容,就是将a的地址的内容传给*p,之后通过*p判断系统是大端存储还是小端存储。

当然还可以通过函数的方式来判断

代码展示

cpp 复制代码
int infer_sys()
{
	int a = 1;
		return *(char*)&a;
}
int main()
{
	int ret = infer_sys();
	if (ret == 1)
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

代码解析

在这个代码中,我们使用函数的方式来判断系统是大端存储还是小端存储,我们直接来看到函数,之前我们了解到我们只需要找到整型变量a的第一个字节的内容就可以完成对程序大小端的判断,那么现在我们是不是可以直接找到变量a第一个字节的地址,之后对它进行解引用,那么这样我们也可以找到内存中a的第一个字节的值,之后来判断。

我们定义函数infer_sys,用来判断我们大小端,给函数一个返回值使用ret来接收,返回1,我们认为系统是小端存储,返回0,系统是大端存储。

那么我们这里函数的返回值就是int类型了,在定义变量a=1之后,我们只需要找到a内存中的第一个字节的内容,之后将存储内容返回就可以成功判断大小端了。

运行结果

与我们判断结果一样,我们使用的vs2022的存储方式是小端存储。

今天就到这里喽,继续加油加油!!

相关推荐
转世成为计算机大神11 分钟前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky12 分钟前
C语言:数组
c语言·数据结构
宅小海30 分钟前
scala String
大数据·开发语言·scala
qq_3273427333 分钟前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍34 分钟前
Scala的Array数组
开发语言·后端·scala
心仪悦悦37 分钟前
Scala的Array(2)
开发语言·后端·scala
yqcoder1 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
Swift社区1 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
baivfhpwxf20231 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
许嵩661 小时前
IC脚本之perl
开发语言·perl