【C语言】数据在内存中的存储(包含大小端字节序问题)~

一、前言

  • 我们在刚开始学习C语言的时候,就接触到了很多数据的不同类型
  • 我们也知道,数据是存储在一块内存空间的,且我们只知道数据的类型决定着,该数据在内存中所占内存空间的大小,
  • 且超过一个字节的数据在内存中存储的时候,就有(以字节为单位)存储顺序的问题。
  • 可我们更应该知道,数据不仅仅只是存储到指定的空间就完事了,而是不同类型的数据有它相对应的存储原则的。
  • 这篇文章就是讲解不同类型的数据是在内容中的存储方式+大小端字节序
  • (本篇文章只对整型家族与浮点型家族对其在内存中的布局进行详解)待更~

二、整型数据在内存的存储

1.如何存储整型数据?
  • 整数的二进制表示形式有三种:原码(整数数据按照二进制的转换后,得到的就是原码)、反码、补码。
  • 而整数在内存中是以补码的形式存储的。
  • 这三种表示形式都有符号位与数值位,符号位用‘1’表示负,用‘0’表示正,而符号位是数值位的最高一位作为符号位
  • 若整数类型是无符号整型,则会把最高位也看成数值位,而把数据默认为正数。且它的反码与补码都等于原码
  • 当是有符号的整数时,整数为正时,原码、反码、补码相同。为负的时候,则需要按照下面的运算法则得到补码。
  • 原码(整数数据按照二进制的转换后,得到的就是原码);反码(原码,保持符号位不变,其余位按位取反(~)得到反码);补码(反码 + 1得到补码)。
  • 补:补码按照同样的运算法则,可以得到原码。
2.补码的意义是什么?
  • 补码可以让在内存中存储的整数数据,符号位与数值位统一处理。
  • CPU只有加法器,无论进行加法还是减法,两数补码直接相加即可
  • 原码转换为补码;补码转换原码,运算法则相同。(符号位不变,数值位按位取反,后+1)
3.如何读取整型数据?
  • 整型数据的读取较为简单,怎么存的怎么读出来就行
  • 首先,判断该数据类型是否是整型类型
  • 其次,判断该整数是signed的整型类型还是unsigned整型类型
  • 若为,若为signed的整型类型,且存的整数是负数,需紧记原反补的转换!!!

三、浮点型数据在内存中的存储

1.如何存储浮点型数据(伏笔)
  • (-1)^S  *  M  *  2^E  
  • 任何一个二进制的浮点型数据,都可以用上面的科学计数法表达式来表示;
  • S:用于决定该浮点型数据的正负号,S=0时,数据的正负性为正,S=1时,数据的正负性为负。
  • M:是一个>1 且 <2的有效数字(我们联想到十进制的科学计数法的有效数字也就能理解到这点)。
  • E:是一个指数
  • S M E在内存中的布局(下面的的讲解都将以float类型展开,也就是4字节的)
2.如何存储浮点型数据(开始)
  • 上面只是介绍了一些有关存储浮点型数据的相关的概念,可这些不足以让我们深入理解到浮点型到底在内存中是如何存储的。
  • 存储S数据:
  • 很简单,数据是正的,S位上就是0,反之,位1。
  • 存储M数据:
  • 因为我们都知道M都是一个>1 且 <2的有效数字;
  • 为了能让内存得到更高效的利用,在M中的数据存储到内存的时候,都会将M小数点前面的1省去,只保留小数部分。
  • 而等我们读取数据的时候,会将M的1再补上去,这样就更高效的利用了一个比特位。
  • 存储E数据:
  • E是一个无符号整型数据,可是浮点型数据是有正负性之分的,那如何去解决这一难题呢?
  • 我们在存储E的数据的时候会加上一个中间值,进行转换,存储到内存中。
  • 读取的时候,也会把得到的数据减去这个中间值。
  • 中间值是什么?
  • 用8比特位存储E数据的时候,其中间值是127(255/2)
  • 用11比特位存储E数据的时候,其中间值是1023(2047/2)
  • 这里我将举两个例子
3.如何读取浮点型数据(结尾)
  • 只要理解了如何存储浮点型数据,那读取数据就迎刃而解(怎么走的,就怎么回来),但是也有一些特殊的地方,比如对E数据的读取。
  • 存储E数据的比特位全为0的时候:(这是一个无限小的数字)
  • 这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字
  • 存储E数据的比特位全为1的时候:(这是一个无限大的数字)
  • 这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s);
  • E不全为0或不全为1
  • 怎么存E的数据,就怎么读取就行。

四、大小端字节序

1.概念的引出
2.大小端字节序的概念
  • 小端字节序存储:
  • 高位的数据存储的高地址处;低位的数据存储到低地址处
  • 大端字节序存储:
  • 高位的数据存储的低地址处;低位的数据存储到高地址处
3.如何判断当前机器的字节序是哪种类型
  • 不同平台的是大端字节序的存储,还是小端字节序存储是不一样的,我们能做的就是通过一定的手段获得机器是大端字节序存储,还是小端字节序存储。
  • 指针求解:
  • 联合体求解:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【项目实践Day06】异步请求与同步请求+Ajax+微信小程序上实现发送异步请求

什么是同步和异步 同步 在主线程上排队执行的任务,只有前一个任务执行完毕,才能继续执行下一个任务。也就是一旦调用开始,就必须等待其返回结果,程序的执行顺序和任务排列顺序一致。客户端必须等待服务器端的响应。在等待的期间客…

Android源码阅读 SharedPreferences - 1

目录 前言 正文 SharedPreferences.java PreferenceManager.java ContextImpl.java 前言 由于笔者目前水平限制,表达能力有限,尽请见谅。 SharedPreferences提供了一种轻量级的数据存储方式,允许保存和获取简单的键值对。它适用于保存少…

转座子插入序列分析1-GENE-IS分析管道

如果你使用 GENE-IS: Saira Afzal et al。 ,2016请引用这篇研究文章。GENE-IS: time-efficient and accurate analysis of viral integration events in large-scale gene therapy data. Molecular Therapy - Nucleic Acids 2016, vol. 6:133-139. DOI:https://doi.…

做好外贸网站SEO优化,拓展海外市场

随着全球贸易的发展和互联网的普及,越来越多的外贸企业将目光投向了网络,希望通过建立网站来拓展海外市场。然而,在竞争激烈的外贸市场中,要让自己的网站脱颖而出,吸引更多的目标客户,就需要进行有效的SEO优…

StarRocks 记录

《实时数仓StarRocks集群部署》

提升Spring Boot应用性能的秘密武器:揭秘@Async注解的实用技巧

引言 在日常业务开发中,异步编程已成为应对并发挑战和提升应用程序性能的关键策略。传统的同步编程方式,由于会阻碍主线程执行后续任务直至程序代码执行结束,不可避免地降低了程序整体效率与响应速度。因此,为克服这一瓶颈&#…

win11环境安装VmwareLinux

VMware 安装Vmware 操作系统: win11 VM版本: 重启系统 输入许可证秘钥 安装centos finalshell连接linux服务 配置虚拟机运行状态 查询linux服务器的ip地址 下载finalshell 访问FinalShell官网 (hostbuf.com)

Spring6入门到高级-动力节点老杜

文章目录 OCP开闭原则依赖倒置原则控制反转依赖注入DISet方法注入构造注入 Sping特点代理模式代理模式中的角色动态代理JDK动态代理newProxyInstance() 的三个参数 JDK实现代理的步骤第一步:创建目标对象第二步:创建代理对象第三步:调用代理对…

C语言学习--八种排序算法

目录 排序的概念 1.直接插入排序 基本思想 代码实现 算法分析 2.希尔排序 基本思想 代码实现 算法分析 3.冒泡排序 基本思想 代码实现 算法分析 4.快速排序 基本思想 代码实现 算法分析 5.简单选择排序 基本思想 代码实现 算法分析 6.堆排序 基本思想 代…

合合信息扫描全能王亮相静安区3·15活动,AI扫描带来绿色消费新体验

保护消费者的合法权益,是全社会的共同责任。为优化消费环境、促进品质消费高地建设,打造安全优质和谐的消费环境,上海静安区消保委于3月15日举办静安区2024年“315”国际消费者权益日活动。 “激发消费活力,绿色低碳同行”是本次3…

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

傻傻分不清目标检测、语义分割和实例分割,看这篇就够了

⭐️ 导言 随着深度学习技术的飞速发展,计算机视觉领域取得了巨大的进步。目标检测、语义分割和实例分割是计算机视觉中的重要任务,它们在图像理解和视频分析等方面发挥着关键作用。本文将深入探讨这三个任务的概念、原理、常用算法以及在实际应用中的案…

(css)vue 自定义背景 can‘t resolve

(css)vue 自定义背景 can’t resolve 旧写法: background-image: url(/assets/images/step-bg.jpg);background-size: 100% 100%; 新写法: background-image: url(~/assets/images/step-bg.jpg);background-size: 100% 100%; 解决参考:https…

shopee无货源出单了怎么发货?shopee怎么做无货源?

在Shopee的电商大舞台上,“无货源出单”就像是一场神奇的魔术表演。你的店铺是舞台,买家的订单是观众的掌声,而你,就是那位神秘的魔术师。订单来了,你却没有货?这可不是什么障碍,因为你有着更为…

算法详解——选择排序和冒泡排序

一、选择排序 选择排序算法的执行过程是这样的:首先,算法遍历整个列表以确定最小的元素,接着,这个最小的元素被置换到列表的开头,确保它被放置在其应有的有序位置上。接下来,从列表的第二个元素开始&#x…

[MySQL]数据库基础

文章目录 1.连接服务器2.理解mysql3.初见数据库4.主流数据库5.服务器,数据库,表关系6.数据逻辑存储7.MySQL架构8.SQL分类9.存储引擎 1.连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -p -h:指明登录部署mysql服务的主机。没有写 -h 127.0.…

【链表】Leetcode 21. 合并两个有序链表【简单】

合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 解题思路 1、比较两个链表的头结点,选择其…

jumpserver管理集群

git地址:https://github.com/jumpserver/jumpserver.git 1、下载 jumpserver 需要docker来拉取镜像,没有的话会自动下载docker curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash 拉取的…

Prometheus修改默认数据存储时间

Prometheus的默认数据存储时间可以通过修改启动脚本中的相关参数来调整。具体来说,可以通过修改--storage.tsdb.retention.time参数来改变数据保留的时长。该参数决定了何时删除旧数据,默认为15天。如果需要延长数据保留时间,可以将该参数的值…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Hyperlink)

超链接组件,组件宽高范围内点击实现跳转。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件仅支持与系统浏览器配合使用。 需要权限 使用网络时,需要申请权限ohos.per…