大小端解释以及如何使用程序判断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的存储方式是小端存储。

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

相关推荐
安之若素^9 分钟前
启用不安全的HTTP方法
java·开发语言
许愿与你永世安宁10 分钟前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子13 分钟前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
ruanjiananquan9915 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
一个天蝎座 白勺 程序猿26 分钟前
Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘
开发语言·python
满分观察网友z44 分钟前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
持梦远方1 小时前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx1 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring