【C语言】大小端介绍以及判断大小端的两种方式

news2024/9/24 3:30:02

前言
🎈大家好,我是何小侠🎈
🍃大家可以叫我小何或者小侠🍃
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸

花繁柳密处,拨得开,才是手段;风狂雨急时,立得定,方见脚根。
解释:在花繁叶茂、柳密如织的美丽和复杂情境下,如果还能不受束缚,来去自如,才是有手段、有办法的人。在狂风骤雨的狼狈状态下还能站稳脚跟,不被吹倒,才是真正有原则的大英雄。

在这里插入图片描述


    这篇博客我们将会了解到数据在内存中的存储方式。这对我们调试和理解内存都有很大好处。
    在这里插入图片描述

    目录

    • 例子展示⁉️
    • 大端小端是什么呢?😶‍🌫️
    • 为什么存在大小端呢?🚩
    • 判断大小端的两种方法
      • 方法一
      • 第二种方法🦚
    • 总结🍊

    例子展示⁉️

    在这里插入图片描述
    我们把10这个整型存储在变量a中, 把-10存储在变量b中。
    我们动手写一下就知道10存储在a中的补码是

    0000 0000 0000 0000 0000 0000 0000 1010 (原码反码补码)

    转换为十六进制就是== 00 00 00 0a==

    -10的原码是

    1000 0000 0000 0000 0000 0000 0000 1010 (原码)

    1111 1111 1111 1111 1111 1111 1111 0101 (反码)

    1111 1111 1111 1111 1111 1111 1111 0110(补码)

    转换为十六进制就是== FF FF FF F6==

    调试起来看看内存
    在这里插入图片描述
    不应该是 00 00 00 0aFF FF FF F6吗?
    下面我们来解释一下。

    大端小端是什么呢?😶‍🌫️

    大端(存储)模式小端(存储)模式
    将数据的高位存放到内存的低地址 ,数据的低位存放到内存的高地址将数据的高位存放到内存的高地址,数据的低位存放到内存的低地址

    也许这样说你可能不是很理解不要紧,下面我会画图讲解:在这里插入图片描述
    在这里插入图片描述
    首先我们要知道一个叫字节序的概念:
    0x22334455
    在这里插入图片描述
    这就是字节序,和高位低位的概概念

    我们将0x22334455存放到a变量中,那么小端是怎么样呢?
    在这里插入图片描述
    那么大端就很明显了
    在这里插入图片描述
    这里补充一句:

    对于一个字节的数据,它只有一个字节,没有字节序的概念。字节序是指多字节数据在内存中的存储顺序,而一个字节的数据只有一个字节,没有多个字节需要进行存储顺序的考虑。

    为什么存在大小端呢?🚩

    为什么会有大小端模式之分呢?
    这是因为在计算机系统中,我们是以字节为单位的,
    每个地址单元 都对应着一个字节,一个字节为8 bit。
    但是在C语言中除了8 bit的char之外,
    还有16 bit的short型,
    32 bit的long型(要看具体的编译器),
    另外,对于位数大于8位 的处理器,
    例如16位或者32位的处理器,
    由于寄存器宽度大于一个字节,
    那么必然存在着一个如何将多个字节安排的问题。
    因此就 导致了大端存储模式和小端存储模式。

    那为什么我们在例子展示的时候,只是小端呢?
    这样因为C语言并没有明确规定要怎么存储,大端小端是由编译器决定的。

    判断大小端的两种方法

    方法一

    我们直接上代码:

    int jugde(int a)
    {
    	char* str = (char *) & a;
    	if (*str == 1)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    
    }
    int main()
    {
    	int a = 0x1;
    	int i = jugde(a);//返回1为小端,返回0为大端
    	if (i)
    	{
    		printf("小端\n");
    	}
    	else
    		printf("大端\n");
    
    	return 0;
    }
    

    其实是比较简单的,
    我们知道a = 0x00 00 00 01;
    那么如果是小端存储 在内存中就是 01 00 00 00
    我们将a 变量的值传到 judge 函数中,judge函数会创建一个新的变量a来接受0x 00 00 00 01,我们用一个char * 类型的指针指向a,或者说把a的地址放到str变量中,为什么是char * 类型呢?
    我们知道指针类型决定了

    • 指针变量解引时能访问多少个字节,
    • 和指针±的步长为多大。

    这里明显就是和访问字节相关,
    char * 类型的指针能访问1个字节
    也就说

    • 如果是小端 * str的值就是1,
    • 如果是小端 *str的值就是0,
      在这里插入图片描述

    是不是很巧妙。还有更巧妙的:
    我们可以改进我们上面的这个代码:

    int jugde(int a)
    {
    	char* str = (char *) & a;
    	
    	return (*str);
    }
    int main()
    {
    	int a = 0x1;
    	int i = jugde(a);//返回1为小端,返回0为大端
    	if (i)
    	{
    		printf("小端\n");
    	}
    	else
    		printf("大端\n");
    
    	return 0;
    }
    

    我们知道 * str的值无非两种,要么是0要么是1,那么为什么不直接返回 * str呢?

    其实还能改进,
    我们能不能不用指针呢?
    当然可以!!

    int jugde(int a)
    {
    	
    	return *(char*)&a;
    
      }
    int main()
    {
    	int a = 0x1;
    	int i = jugde(a);//返回1为小端,返回0为大端
    	if (i)
    	{
    		printf("小端\n");
    	}
    	else
    		printf("大端\n");
    
    	return 0;
    }
    

    我们先取地址a,然后强转为(char *)类型,这样我们解引用的范围就是一个字节了,然后就更上面的方法一样的,确实妙啊在这里插入图片描述~~~。

    第二种方法🦚

    第二种方法运用了联合体!

    int jugde()
    {
    	union test
    	{
    		int a;
    		char b;
    		
    
    	}u;
    	u.a = 1;
    	return u.b;
    
    }
    int main()
    {
    	if (jugde() == 1)
    	{
    		printf("小端\n");
    	}
    	else
    		printf("大端\n");
    	return 0;
    }
    

    我们画图来简单看看:
    在这里插入图片描述
    这样我们就知道return u.b;到底是在干些什么。

    总结🍊

    我们在这篇博客中介绍了什么是大小端,为什么会有大小端,还有大小端的两种巧妙的判断方法,你全都get到了吗?在这里插入图片描述

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

    在这里插入图片描述在这里插入图片描述
    如果本文有任何错误或者有疑点欢迎在评论区评论
    在这里插入图片描述

    在这里插入图片描述

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710640.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    【探索 Kubernetes|作业管理篇 系列 16】离线业务 Job、CronJob

    前言 大家好,我是秋意零。 在上一篇中,我们讲解了 DaemonSet 控制器,相信你以及理解了其的工作过程,分为三部。一是,获取所有 Node 节点中的 Pod;二是,判断是否有符合 DaemonSet 管理的 Pod&a…

    osg实现镜面成像、倒影效果

    目录 1. 需求提出 2. 代码实现 3. 功能讲解 3.1. 设置地面半透明 3.2. 设置镜面倒影成像 3.3. 设置地面颜色 3.4. 设置相机初始位置 4. 总结 1. 需求提出 平时的业务需求,有时需要实现镜面成像、倒影效果,如下&#xff1a…

    79、基于STM32单片机DHT11温湿度无线蓝牙手机APP监控报警系统(程序+原理图+PCB图+设计资料+参考论文+开题报告+元器件清单等)

    摘 要 温湿度控制已成为当今社会研究的热门项目。是工农业生产过程中必须考虑的因素。作为最常见的被控参数。温度和湿度已经不再是相互独立的物理量,而应在系统中综合考虑。广泛应用于实验室、大棚、花圃、粮仓乃至土壤等各个领域。而传统的温湿度控制则利用湿度…

    Qt QLineEdit篇

    QLineEdit篇 【1】QLineEdit简介【2】QLineEdit常用方法【3】QLineEdit使用举例UI设计界面效果头文件源文件 PC饱和了,跟我学Qt比较实在,哈哈哈 【1】QLineEdit简介 QLineEdit是Qt框架中的一个类,用于创建一个文本输入框,允许用…

    【WSN定位】基于蜣螂优化算法DBO的Dvhop定位算法 不同锚节点比例和不同通信半径情况下对比【Matlab代码#45】

    文章目录 【可更换其他算法,获取资源请见文章第5节:资源获取】1. Dvhop定位算法2. 蜣螂优化算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法,获取资源请见文章第5节:资源获取】 1. Dvhop定位算法 根据距离矢量和…

    #systemverilog# 关于随机约束之 约束块

    随机变量的值通过由约束块声明的约束表达式来确定。像任务、函数和变量一样,随机块是类的成员。在一个类中,约束块的名字必须是唯一的。 一 语法定义 声明约束块的语法如下: (1)constraint_identifier是约束块的名字。使用constraint_mode()(参见12.8节)方法,这个名字…

    初步认识Java垃圾回收算法

    GCRoot指被栈上直接或间接引用的对象,或被本地方法栈直接或间接引用的对象,或被方法区引用的对象。 被引用的对象是不能被删除的。 如果对象跟GCRoot并没有直接或间接相连的关系,那么这些对象就可以被删除了。 标记-清理:将需要删…

    C++智能指针使用陷阱、shared_ptr实现

    一 智能指针使用概述 1.使用场景 1.1 unique_ptr 1.1.1 概念 std::unique_ptr 是通过指针占有并管理另一对象,并在 unique_ptr 离开作用域时释放该对象的智能指针。 std::unique_ptr 常用于管理对象的生存期,包含: 通过正常退出和经由异…

    SpringBoot 实现导出数据 - EasyExcel 导出数据

    文章目录 1. EasyExcel 介绍2. 导出2.1 引入依赖2.2 构建测试实体类 3. 设置单元格大小 1. EasyExcel 介绍 EasyExcel 官网介绍 传统操作Excel大多都是利用 Apach POI 进行操作的,但是 POI 框架并不完善,使用过程非常繁琐且有较多的缺陷: 动态…

    lesson11 Zigbee MAC地址通信

    目录 Zigbee MAC地址通信 前言 查看MAC地址(含组网过程抓包分析) 方法1:通过dongle抓包查看MAC地址 方法2:仿真调试查看MAC 实验过程 实现步骤 实验效果 出错分析 最终现象 结果分析 Zigbee MAC地址通信 前言 1、Zig…

    Python中类的变量,一个下划线与两个下划线的区别

    形似 功能__xx这是私有变量, 只有内部可以访问,外部不可以访问。但是也不是一定不可以访问,只要以 _类名__xx样式就可以访问 。但最好不要这样做,养成良好编程习惯_x这是实例变量,可以访问,但是不要轻…

    STM32MP157-正点原子第六章tf-a使用编译错误

    原因:交叉编译工具链选择错误 亲测: gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz 和 gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz 可以成功编译 下载网址https://mirrors.tuna.tsinghua.edu.cn/armbian-relea…

    全国各城市交通运输邮电业本地电话用户(1999-2020年)

    本数据展示了全国各城市的本地电话用户数量。通过对这些数量的分析,可以了解全国各城市通信设施建设的发展情况、人口密度以及工业经济的发展程度等方面的信息。此数据不仅可供政府部门制定信息技术政策,还可以为企业投资提供重要参考。同时,…

    Leetcode-每日一题【382.链表随机结点】

    题目 给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点被选中的概率一样 。 实现 Solution 类: Solution(ListNode head) 使用整数数组初始化对象。int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相…

    网络空间安全专业未来的发展前景以及薪资待遇如何?

    不管是考虑未来报读专业的准大学生,还是初入职场的实习生,亦或是想要跳槽转岗的职场人,当我们开始选择一份工作时,本质上都在考虑以下三个问题: 这份工作的收入水平如何;这份工作有没有发展前景&#xff1…

    基于卷积神经网络的目标分类案例

    文章目录 一、卷积神经网络二、环境配置及数据集准备三、猫狗数据分类建模1、猫狗图像预处理2、猫狗分类的实例——基准模型3、基准模型的调整 一、卷积神经网络 卷积神经网络(Convolutional Neural Networks, CNN 是一类包含卷积计算且具有深度结构的前馈神经网络…

    HashMap源码分析

    文章目录 1、put方法流程2 、扩容机制3 、get方法 分析源码我们一般从三个方面入手&#xff1a; 常见属性&#xff08;成员变量&#xff09;构造方法关键方法 下面分析一下HashMap源码&#xff1a; 首先常见属性有&#xff1a; DEFAULT_INITIAL_CAPACITY 1 << 4; // a…

    二叉树进阶——搜索二叉树

    搜索二叉树 1. 概念2. 二叉搜索树的操作2.1 查找2.2 插入2.3 删除&#xff08;重点&#xff09; 3. 搜索二叉树的应用4. 搜索二叉树的性能分析 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&am…

    《项目实战》构建前后端一体化项目查询CSDN博客Top100文章质量分

    系列文章目录 构建前后端一体化项目查询CSDN博客Top100文章质量分 文章目录 系列文章目录前言1、搭建后端框架1.1、 创建RestFull风格接口1.2、创建获取数据服务1.2.1、在个人博客页&#xff0c;找到获取全部博文的路径&#xff08;页面-> network->找到加载博文的地址&…

    C# ---委托机制 delegate 和 回调方法 callback

    C# --- 委托机制 delegate 和 回调 callback 什么是委托机制委托机制的优点C# 中的Action 和 Func委托机制的主要用处 --- 回调 Callback 什么是委托机制 委托机制相当于C语言中的函数指针, 将一个方法的reference传入另外一个方法中 Example //创建一个方法 //创建一个委托 …