当前位置: 首页 > news >正文

C语言(长期更新)第18讲:数据在内存中的存储

  C语言(长期更新)第18讲

数据在内存中的存储

     跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力博主主页:潼心1412o-CSDN博客


目录

  C语言(长期更新)第18讲

数据在内存中的存储

知识回顾

18.1 整数在内存中的存储

18.2 大小端字节序和字节序判断

18.2.1 什么是大小端

18.2.2 练习

18.3 浮点数在内存中的存储

18.3.1 浮点数存的过程

18.3.2 浮点数取的过程


知识回顾

上节课我们学习了内存函数,今天我们来学习内存函数,坐稳了,我们发车,gogogo,出发喽!


18.1 整数在内存中的存储

对于整数,内存中存放的是补码

原因有三:

使用补码可以将数值域和符号位统一处理

加法减法也可统一处理(CPU只有加法器)

补码原码之间的转换,运算过程相同,不需要额外的硬件电路

18.2 大小端字节序和字节序判断

18.2.1 什么是大小端

只要数据超过一个字节,就有存储顺序的问题

大端(存储)模式

数据低字节内容保存至内存高地址,高字节低地址

小端(存储)模式

低字节低地址,高字节高地址(在数字的存储上表现为倒着放)

18.2.2 练习

练习一

简述大小端概念,设计一小程序判断当前机器的字节序

思路:以1为例,大端末尾就是1,小端存储就是0

怎么拿到末位呢?可强制类型转换

注意不要直接强制类型转换为char 

而是要先取地址再强制转换为char*类型,再解引用

why?因为只有解引用地址访问才是低地址的内容,而强制转换为char,语法没有规定,不同编译器处理不同,会导致结果不稳定。但是强转为char*后解引用,访问的一定是低地址的内容

练习二

注意存的时候要发生截断,打印的时候要提升

练习三

练习四

在完成这道题之前,首先我们需要先思考一个问题

char类型的取值范围为什么是-128到127

我们经过规律总结,得到一个圈

下面我们再来看这段代码

这下看懂了

练习五

unsigned char的取值范围是0~255,所以说条件很成立,陷入死循环

道理和前面一样,unsigned int一定是大于等于0的,所以条件恒成立导致死循环的产生

练习六

18.3 浮点数在内存中的存储

浮点数家族包括float double long double

浮点数取值范围在float.h中定义

我们先来看段代码

这段代码的运行结果可能会和我们设想的不大相同

怎么个事呢

我们发现,浮点数和整数的存储大不相同

在国际标准IEEE(电气电子工程协会)754中规定

任意一个二进制浮点数可以表示为以下形式

V = (-1)^S * M * 2^E

  • (-1)^S 表示符号位,当S=0,V为正数;当S=1,V为负数
  • M 表示有效数字,M是大于等于1,小于2的(其实就是1点几)
  •  2^E 表示指数位

IEEE 754规定:

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M 对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

18.3.1 浮点数存的过程

IEEE 754 对有效数字M和指数E,还有⼀些特别规定。

计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的小数部分。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。

指数E,情况就⽐较复杂

⾸先,E为⼀个⽆符号整数(unsigned int)取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

18.3.2 浮点数取的过程

取的过程分为三类

1.E小数部分非全0或全1

先加127,还原M的真实值;再加上省去的1,还原E

2.E全0

加过127还是0,说明这个数非常小,我们将它视作0

3.E全1

那就已经非常大的数了,视作无穷,具体±看S

这下这个题就解决了


 好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~​​​ 

博主主页:潼心1412o-CSDN博客

http://www.dtcms.com/a/389096.html

相关文章:

  • 模块三 进阶微服务
  • Vue3 组件封装原则与实践指南
  • Git合并冲突
  • 部署K8S集群
  • K8S配置管理:ConfigMap与Secret
  • 奥威BI+ChatBI:数据智能时代的一体化解决方案
  • 微服务与云原生实战:Spring Cloud Alibaba 与 Kubernetes 深度整合指南
  • 从慕尼黑到新大陆:知行科技「智驾」与「机器人」的双行线
  • VINTF中manifest.xml和compatibility_matrix.xml的作用
  • AI时代云原生数据库一体机的思考
  • 配置manifest.xml和compatibility_matrix.xml
  • Prometheus高可用监控架构性能优化实践指南
  • 低代码平台与云原生开发理念是否契合?
  • 红队测试手册:使用 promptfoo 深入探索大语言模型安全
  • el-date-picker设置默认值
  • 结语:Electron 开发的完整路径
  • 数据结构系列之线性表
  • Vue2 生命周期钩子详解:beforeCreate、created、mounted、beforeDestroy 用法顺序与坑点指南
  • electron nodejs安装electron 以及解压打包
  • 每日一题:链表排序(归并排序实现)
  • 团体程序设计天梯赛-练习集 L1-032 Left-pad
  • AI的出现,能否代替IT从业者
  • 一个基于Java+Vue开发的灵活用工系统:技术实现与架构解析
  • 原神望陇村遗迹 解谜
  • 半导体制造常提到的Fan-in晶圆级封装是什么?
  • MySQL 专题(五):日志体系(Redo Log、Undo Log、Binlog)原理与应用
  • 锂电池取代铅酸电池作为及其老化率计算常用算法
  • FreeRtos面试问题合集
  • Codeforces Round 1051 Div.2 补题
  • tokenizer截断丢失信息,如何处理?