C语言——数据在内存中的存储【整型数据在内存中的储存,大小端字节序储存,浮点型数据在内存中的储存】

📝前言:
在前面的三篇文章中我们已经完成了对字符函数和字符串函数的学习,现在就让我们探索新领域,更加深入的理解**数据在内存中的存储方式**:
1,整数在内存中的存储
2,⼤⼩端字节序存储
3,浮点数在内存中的存储

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:请记住,人生唯一确定的,就是不确定的人生

文章目录

  • 一,整数在内存中的存储
    • 1,为什么要以补码的形式储存呢?
    • 2,原码,反码,补码的区别
      • ①正数:
      • ②负数:
  • 二,大小端字节序存储
    • 1,⼤⼩端存储的区别
    • 2,为什么要有大小端存储之分?
  • 三,浮点型数据在内存中的储存
    • 1,二进制浮点数的另一种表示形式
    • 2,浮点数储存过程
      • 1)符号位S的储存
      • 2)有效数M的储存
      • 3)指数E的储存
    • 2,浮点数取的过程
      • 1)E不全为0或不全为1
      • 2)E全为0
      • 3)E全为1

一,整数在内存中的存储

对于整型数据来说:数据是以补码的形式存放在内存中

1,为什么要以补码的形式储存呢?

(简单来说)因为:
计算机的CPU只有加法器,但是在**二进制中,正数和负数的表示方法不同。如果我们想统一加法和减法的操作,就需要将所有的数(无论正负)都转换为一种表示方式**,【补码就是其中的一种表示方式。】
当都转化为补码这一种形式的时候,我们就可以统一加法和减法操作,从而简化了计算机的运算过程。

2,原码,反码,补码的区别

原码,反码,补码到底是什么?
其实原码,反码,补码只是数据的几种不同的表示方式
📑对于所有数据来说:数据二进制的表示方式就是它的原码

那不同数据的反码和补码呢?
我们把整型分成两大类:正数负数

①正数:

●正数的原码,反码,补码是相同的

例如(对于int 类型的数据5

原码:00000000000000000000000000000101
反码:00000000000000000000000000000101
补码:00000000000000000000000000000101

●无符号整型的反码补码原码也都是相同的(因为也都是正数)

②负数:

●原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
●反码:将原码的**符号位不变其他位按位取反**就可以得到反码。
●补码:反码+1就得到补码

例如(对于整型数据-5

原码:10000000000000000000000000000101
反码:11111111111111111111111111111010
补码:11111111111111111111111111111011

(如果要通过补码得到原码:也可以通过【将补码符号位不变,其他位按位取反;再+1的方式】)

所以对5-5而言:
5 在内存中, 就是以5的补码 : 00000000000000000000000000000101存放的
-5在内存中,就是以-5的补码:11111111111111111111111111111011存放的

二,大小端字节序存储

1,⼤⼩端存储的区别

●⼤端(存储)模式:将数据低位字节的内容保存在内存的⾼地址处,⽽数据⾼位字节的内容,保存
在内存的低地址处。
●⼩端(存储)模式:将数据低位字节的内容保存在内存的低地址处,⽽数据⾼位字节的内容,保存
在内存的⾼地址处。

其实就是看数据**低位字节的内容保存在哪里**
●保存在内存的高地址处,就是大端存储
●保存在内存的低地址处,就是小端存储

例如,对于0x11223344这个数据:
在这里插入图片描述
那么,我们来看看VS:
在这里插入图片描述

我们可以看到:
a的内容11223344被储存为了44332211
这就是因为博主的计算机中的VS是用小端模式来储存数据的

2,为什么要有大小端存储之分?

C语言中的大小端存储之分主要是为了解决不同计算机系统之间的通信和数据交换问题。由于不同的计算机系统可能有不同的字节序,因此需要一种统一的方式来表示和传输数据。C语言提供了大小端存储之分,使得在不同的计算机系统之间可以正确地解析和传输数据
总的来说,大小端存储之分是为了解决不同计算机系统之间的字节序问题,以保证数据的正确解析和传输。

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

开门见山:浮点数在内存中的储存与整数是不一样的!
整数是以补码的方式储存,那浮点数呢?

1,二进制浮点数的另一种表示形式

我们先来了解二进制浮点数的另一种表示形式👇🏻

根据国际标准IEEE🔍, 任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
(-1)^S * M * 2^E
• (−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M 表示有效数字,(1<=M<2)
• 2^E表示指数位。

比如👇🏻:
•⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2
【 S=0,M=1.01,E=2 】
•⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 - 1.01×2^2
【 S=1,M=1.01,E=2 】
•十进制的5.5,写成二进制是 101.1 ,相当于 1.011×2^2
【S=0,M=1.011,E=2】
(注意这里都是二进制,所以每一位上对应的权重的底数应该是2)
比如101.1:从左到右每位数依次对应的权重是:2^2, 2^1, 2^0, 2^(-1)

2,浮点数储存过程

我们可以发现,每个浮点数,都可以用S M E 三个数据来表示出来,因此我们在储存时,也只需储存好这三个数据就可以了

IEEE 754规定:
•对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
•对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
👇🏻
在这里插入图片描述

1)符号位S的储存

•正数储存0
•负数储存1

2)有效数M的储存

浮点数中的有效数一般写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。
如:浮点数5.51.011×2^2011是小数部分

🔍IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此会被舍去,只保存后⾯的xxxxxx部分。(因为1<=M<2,M总是1.xxxxxx 的形式)
如:浮点数5.5,只保留011这个小数部分

3)指数E的储存

E为⼀个⽆符号整数(unsigned int),意味着,如果E为8位,它的取值范围为0到255;如果E为11位,它的取值范围为0到2047。但是,科学计数法中,指数E可能是负数!!!
所以👇🏻
IEEE 754规定,E存⼊内存时,E的真实值必须再加上⼀个中间数:
•对于8位的E,这个中间数是127
•对于11位的E,这个中间数是1023
⽐如,5.52^2的E是2,所以保存成32位浮点数时,必须保存成2+127=129,即10000001

所以浮点数5.5在内存中的储存应该是:
在这里插入图片描述

2,浮点数取的过程

1)E不全为0或不全为1

•指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1
如取5.5
•S = 0
•E:10000001(十进制的129),129-127 = 2 ,得到真实值E = 2
•再将有效数字M(011)前加上第⼀位的1,得1.011
所以,5.5 = (-1)^0 × 1.011 × 2^2

2)E全为0

表示趋近于0的很小的数字
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还
原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字

0 00000000 00100000000000000000000

3)E全为1

表⽰±⽆穷⼤(正负取决于符号位S)

0 11111111 00010000000000000000000

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

SuperMap Hi-Fi 3D SDK for Unity矢量面贴地贴模型

作者&#xff1a;kele 一、背景 SuperMap Hi-Fi 3D SDK&#xff08;2023 11i&#xff09; for Unity推出新功能&#xff1a;支持矢量面同时贴地形图层和模型图层&#xff0c;并且能实现数据点击查询属性、更改初始填充颜色、初始边框线颜色、选中填充颜色、选中边框线颜色、控…

基于SSM实现的电动汽车充电网点管理系统

一、系统架构 前端&#xff1a;jsp | jquery | bootstrap | css 后端&#xff1a;spring | springmvc | jdbc 环境&#xff1a;jdk1.8 | mysql 二、代码及数据库 三、功能介绍 01. web端-首页 02. web端-登录 03. web端-注册 04. web端-我要充电 05. web端-个人中心-消…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] &#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。其诞…

nginx源码分析-1

使用gdb查看函数上下文&#xff1a; gdb attach nginx的work线程 监听端口状态时&#xff1a; 断点打在ngx_http_process_request 并通过浏览器触发请求时&#xff1a;

把这些软件测试经典面试题!全背下来,拿offer就像喝水一样!

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&am…

哈希桶的模拟实现【C++】

文章目录 哈希冲突解决闭散列 &#xff08;开放定址法&#xff09;开散列 &#xff08;链地址法、哈希桶&#xff09;开散列实现&#xff08;哈希桶&#xff09;哈希表的结构InsertFindErase 哈希冲突解决 闭散列 &#xff08;开放定址法&#xff09; 发生哈希冲突时&#xf…

【算法刷题】Day26

文章目录 1. 买卖股票的最佳时机含冷冻期题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 替换所有的问号题干&#xff1a;算法原理&#xff1a;代码&#xff1a; 1. 买卖股票的最佳时机含冷冻…

组件间的值传递:改进若依框架中的BarChart.vue组件

改进前的BarChart 如下是若依(Ruoyi)框架中的BarChart.vue文件&#xff0c;该BarChart.vue无法实现组件间的值传递。到这里您不妨可以试试该如何去传值。如果您不想思考&#xff0c;请看改进后的BarChart。直接拿走使用&#xff01; <template><div :class"cla…

大量数据的渲染优化-分页渲染方案

文章目录 直接渲染数据的拆分使用定时器分页渲染 相信有一道耳熟能详的题目&#xff0c;如果前端获取到了 10w 条数据&#xff0c;应该怎么渲染&#xff1f;本文就以此为例&#xff0c;来进行切入&#xff0c;解析大量数据渲染的方案 直接渲染 样式代码比较简单&#xff0c;我就…

Android原生实现单选

六年前写的一个控件&#xff0c;一直没有时间总结&#xff0c;趁年底不怎么忙&#xff0c;整理一下之前写过的组件。供大家一起参考学习。废话不多说&#xff0c;先上图。 一、效果图 实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的backgr…

vue3-富文本编辑器(vue-quill)

官网&#xff1a;VueQuill | Rich Text Editor Component for Vue 3 安装 pnpm add vueup/vue-quilllatest 使用 局部使用 先导包 import { QuillEditor } from vueup/vue-quill import vueup/vue-quill/dist/vue-quill.snow.css; 再使用 <QuillEditor theme"snow…

想要快速搭建知识付费平台?找明理信息科技!

明理信息科技知识付费saas租户平台 一、确定目标群体 首先&#xff0c;你需要明确你的知识付费平台的目标用户是谁。这将帮助你确定所需的内容和功能&#xff0c;以及如何吸引和留住这些用户。例如&#xff0c;如果你的目标群体是职场新人&#xff0c;你的平台可能需要提供…

MFC工程中无法使用cygwin64的库

文章目录 MFC工程中无法使用cygwin64的库概述在MFC中使用cygwin64的静态库在MFC中使用cygwin64的DLL进行静态包含在MFC中使用cygwin64的DLL进行动态调用唯一可以使用cygwin64的方法是进程隔离来通讯cygwin64的官方用途修正后的启动进程隐藏dos窗口的函数动态载入DLL的实现 - La…

代码随想录27期|Python|Day29|回溯算法|491.递增子序列|46.全排列|47.全排列 II

491. 非递减子序列 本题不是单纯的去重题目&#xff0c;而是需要保持数字在原数组的顺序。 比如&#xff1a;[4,5,6,7]和[4,6,5,7]相比&#xff0c;后者就不能选择[5,6,7]这个排列&#xff0c;因为违反了设置的顺序。所以去重的方法就只有哈希表。 需要在每一层设置一个哈希表…

leaflet学习笔记-初始化vue项目(一)

leaflet简介 Leaflet是一款开源的轻量级交互式地图可视化JavaScript库&#xff0c;能够满足大多数开发者的地图可视化需求&#xff0c;其最早的版本大小仅仅38 KB。Leaflet能够在主流的计算机或移动设备上高效运行&#xff0c;其功能可通过插件进行扩展&#xff0c;拥有易于使用…

【Linux】指令(本人使用比较少的)——笔记(持续更新)

文章目录 ps -axj&#xff1a;查看进程ps -aL&#xff1a;查看线程echo $?&#xff1a;查看最近程序的退出码jobs&#xff1a;查看后台运行的线程组fd 任务号&#xff1a;将后台任务提到前台bg 任务号&#xff1a;将暂停的后台程序重启netstat -nltp&#xff1a;查看服务及监听…

C#中的Attribute详解(下)

C#中的Attribute详解&#xff08;下&#xff09; 一、Attribute本质二、Attribute实例化三、Attribute实例化的独特之处四、元数据的作用五、自定义Attribute实例六、Attribute的附着目标七、附加问题 一、Attribute本质 从上篇里我们可以看到&#xff0c;Attribute似乎总跟pu…

SAP VA01 创建带wbs号的销售订单包 CJ067的错误

接口错误提示如下 SAP官方 CJ067 124177 - VA01: CJ067 during WBS acct assgmt with a different business area S4的core 刚好能用上 实施 这个note后成功

nestjs入门教程系列(一):让项目先跑起来

nestjs启动基本步骤 Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。 它使用渐进式 JavaScript&#xff0c;构建并完全支持 TypeScript&#xff08;但仍然允许开发者使用纯 JavaScript 进行编码&#xff09;并结合了 OOP&#xff08;面向对象编程&am…

第二节-数据封装+传输介质

数据传输的形式&#xff1a; 1.电路交换 2.报文交换&#xff1a; 在数据之外&#xff0c;加上能够标识接收者以及发送者的信息 3.分组交换&#xff1a; 依然进行报文交换&#xff0c;不过讲每个数据的大小进行定义 应用层&#xff08;数据data&#xff09;->传输层&am…