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

embedded/2024/10/19 9:41:23/

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

        什么是大小端?

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

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

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

        大端

        

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

        小端

        

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

        vs2022中的存储模式

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

        

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

        

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

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

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

        代码展示

        

#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判断系统是大端存储还是小端存储。

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

        代码展示

        

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的存储方式是小端存储。

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


http://www.ppmy.cn/embedded/11576.html

相关文章

MariaDB简介

MariaDB是一个关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;是MySQL的一个分支&#xff0c;主要由开源社区维护和开发。 一&#xff0c; MariaDB的来历 1. **起源**&#xff1a;MariaDB的诞生与MySQL的所有权变更有关。MySQL最初由MySQL AB公司开发&#xff…

SpringBoot整合Swagger2

SpringBoot整合Swagger2 1.什么是Swagger2&#xff1f;&#xff08;应用场景&#xff09;2.项目中如何使用2.1 导入依赖2.2 编写配置类2.3 注解使用2.3.1 controller注解&#xff1a;2.3.2 方法注解2.3.3 实体类注解2.3.4 方法返回值注解2.3.5 忽略的方法 3.UI界面 1.什么是Swa…

线性模型算法

简介 本文章介绍机器学习中的线性模型有关内容&#xff0c;我将尽可能做到详细得介绍线性模型的所有相关内容 前置 什么是回归 回归的就是整合&#xff0b;预测 回归处理的问题可以预测&#xff1a; 预测房价 销售额的预测 设定贷款额度 可以根据事物的相关特征预测出对…

vue element-ui 表格横向滚动条在合计项下方

目前效果 需求效果 1.隐藏bodyWrapper滚动条&#xff0c;显示footerWrapper滚动条 css代码如下&#xff1a; div ::v-deep .el-table--scrollable-x .el-table__body-wrapper{overflow-x: hidden!important;z-index: 2!important;} div ::v-deep .el-table__footer-wrapper …

HCIP-Datacom-ARST必选题库_43_认证【1道题】

一、单选 1.某公司管理员在认证服务器上修改了某一用户的访问权限和授权属性等参数&#xff0c;此时已经经过802.1x认证成功的用户A会进行以下哪一动作? A用户A不进行重认证&#xff0c;直接被下线 B用户A直接进行重认证&#xff0c;成功则继续正常在线 设备将保留的用户认证…

postman 调试 传base64字符串 原来选xml

上个图 工具类 package org.springblade.common.utils;import com.alibaba.fastjson.JSONObject; import org.springblade.modules.tc.mas.Submit;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStrea…

OpenHarmony图片处理——XmlGraphicsBatik

简介 XmlGraphicsBatik项目用于处理可缩放矢量图形&#xff08;SVG&#xff09;格式的图像&#xff0c;例如显示、生成、解析或者操作图像。 支持SVG图像的显示&#xff0c;可显示静态及动态SVG图像&#xff1b; 支持快捷生成SVG图像文件&#xff1b; 支持操作SVG图像进行颜…

0-1 设计高质量数据可视化大屏

5 大指南塑造高阶可视化 可视化是个友好的媒介 理解数据是成为优秀媒介的关键 业务驱动下的设计策略 图扑设计的无限可能 创新思维让可视化更具价值 可视化是个友好的媒介 我们正处于一个数据泛滥的时代&#xff0c;随处可见数据的身影&#xff0c;更知其不可忽视的重要…