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

news2025/1/16 3:49:18

📝前言:
在前面的三篇文章中我们已经完成了对字符函数和字符串函数的学习,现在就让我们探索新领域,更加深入的理解**数据在内存中的存储方式**:
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://www.coloradmin.cn/o/1340713.html

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

相关文章

聊一聊 JavaScript 中的作用域和闭包

哈喽大家好&#xff0c;我是归思君~ 一、引言 我们知道&#xff0c;作用域&#xff08;Scope&#xff09;就是代码中变量和函数的可访问的区域&#xff0c;这个区域中决定了变量和函数的生命周期。 在当前的高级程序语言中&#xff0c;主要有词法作用域&#xff08;静态作用域…

java设计模式学习之【解释器模式】

文章目录 引言解释器模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用表达式解析示例代码地址 引言 在我们的日常生活中&#xff0c;语言的翻译和理解是沟通的关键。每种语言都有自己的语法规则&#xff0c;而翻译人员和计算机程序需要理解并遵循这些规则来…

Python入门-字符串Str

字符串 字符串 是Python中的 不可变 数据类型 1.字符串相关处理方法 大小写转换 # 大小写转换 s1HelloWorld new_s2s1.lower() print(s1,new_s2)new_s3s1.upper() print(new_s3)结果&#xff1a; D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap6\示例6-1字符…

TiDB SQL调优案例TiFlash

背景 早上收到某系统的告警tidb节点挂掉无法访问&#xff0c;情况十万火急。登录中控机查了一下display信息&#xff0c;4个TiDB、Prometheus、Grafana全挂了&#xff0c;某台机器hang死无法连接&#xff0c;经过快速重启后集群恢复&#xff0c;经排查后是昨天上线的某个SQL导…

代码随想录二刷 | 二叉树 |二叉搜索树中的搜索

代码随想录二刷 &#xff5c; 二叉树 &#xff5c;二叉搜索树中的搜索 题目描述解题思路递归法迭代法 代码实现递归法迭代法 题目描述 700.二叉搜索树中的搜索 给定二叉搜索树&#xff08;BST&#xff09;的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回…

编译错误:C4056E type of input file ‘xxx‘ unknown

最近在Proteus上面进行仿真&#xff0c;将编译后的hex文件导入到电路图中&#xff0c;进行程序运行的时候&#xff0c;Proteus报了这么一个错误&#xff1a;Error: C4065E: type of input file Pian unknown 我上网一搜&#xff0c;好像与文件名称中存在空格有关&#xff0c;导…

别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼!

可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理。 我们一起来看看&#x…

软件测试面试中90%会遇到的问题,面试前刷提高百分之60的通过率

面试的时候&#xff0c;遇到这样的提问&#xff0c;很多人的都会感觉脑子一下一片空白&#xff0c;或者星星点点&#xff0c;不知道从何说起。 一方面不知道面试官问这个问题的意图是什么&#xff1f;也不知道他想得到的答案是什么&#xff1f; 更加不知道该从哪些方面来回答…

机器学习——损失函数

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、简介 损失函数(loss function)又称为误差函数(error function)&#xff0c;是衡量模型好坏的标准&#xff0c;用于估量模型的预测值与真实值的不一致程度&#xff0c;是一个…

大数据Doris(四十二):使用物化视图

文章目录 使用物化视图 一、​​​​​​​创建物化视图

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…

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

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

免费代理IP:如何获取?有什么风险?有什么性价比高的代理IP?

您可能已经知道&#xff0c;生活中没有什么是真正免费的。代理IP虽然用于保护隐私&#xff0c;但也有非常多代理都是免费的&#xff0c;这对于不想使用付费替代方案的用户来说是一个巨大的优势。在这篇博文中&#xff0c;我们将深入研究免费代理的细节&#xff0c;并评估这把双…

3DMAX 中的 VR 渲染器如何设置局部区域渲染?

3DMAX 中的 VR 渲染器如何设置局部渲染&#xff1f; 首先我们要得打开渲染设置&#xff0c;在3damx里按F10&#xff0c;调出渲染设置。选定渲染器为Vary渲染器&#xff1a; 设置VR的局部渲染&#xff0c;需要打开帧缓冲&#xff0c;我们在V-ary项下&#xff0c;打开帧缓冲(点击…

【C语言】初识C语言

本章节主要目的是基本了解C语言的基础知识&#xff0c;对C语言有一个大概的认识。 什么是C语言 在日常生活中&#xff0c;语言就是一种人与人之间沟通的工具&#xff0c;像汉语&#xff0c;英语&#xff0c;法语……等。而人与计算机之间交流沟通的工具则被称为计算机语言&am…

Android Security PIN 相关代码

开发项目遇到一个问题&#xff0c;具体描述及复制步骤如下&#xff1a; 就是开启"Enhanced PIN privacy"(增强的PIN隐私)的时候输入秘密的时候还是会显示数字 如下图&#xff0c;应该是直接是“.” 不应该出现PIN 密码 想要的效果如下图&#xff1a; 设置的步骤如下图…

给零基础朋友的编程课08 - 代码

给零基础朋友的编程课08 - 旋转、圆弧、初识模块化编程。_哔哩哔哩_bilibili Code: / // 彩色案例 艺术仿制品3 // /// 色表 // // 奶白 215,214,160 // 金黄 187,176,112 // 赭石 96,56,20 // 橙色 218,114,53// 项目设定 size(1000,1000); background(215,214,160); stroke…

C++学习实践(一)高频面试问题总结(附详细答案)

文章目录 一、基础常见面试题1、数组和链表区别2、深拷贝和浅拷贝相关问题的区别3、a和a区别4、c内存模型5、四种强制转换和应用场景 二、指针相关1、指针和引用的区别2、函数指针和指针函数3、传指针、引用和值4、常量指针和指针常量5、野指针6、智能指针的用法 三、关键字作用…

Python跳动的爱心完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

Python 小程序之动态二位数组

动态二位数组 文章目录 动态二位数组前言一、基本内容二、代码编写三、效果展示 前言 没想出啥好点子&#xff0c;这次就给大家写个小程序&#xff0c;动态二维数组吧。 一、基本内容 程序画一个二维的方格&#xff0c;然后里面填上1-10的随机数&#xff0c;每隔一秒更新新一…