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

【C语言技能树】浮点数在内存中的存储

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

 

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

近期在复习计算机组成原理,刚好看到了浮点数存储,想起许久之前,就学过了,于是乎记录一下

目录

浮点数存储例子:

内存中的存储:

数据取出:

例子:

完结撒花:


浮点数存储例子:

int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;
}

这里执行完的结果是啥呢?相信没看过相关内容前都各有各的答案,咱暂且按下不表. 接下来看看浮点数在内存中如何存储的

内存中的存储:

由于所有数在机器中都是以二进制的方式进行存储.如果是整形就很简单了,是多少就存多少.

这里以5举例,在二进制中为 101

那浮点数如何存储呢?

这里以5.5举例,他的二进制码为 101.1,前面很好理解,就是照搬5的存储方式

那后面呢?我们知道在整形里最低位为2^0,那么在浮点数中下一位自然是2^(-1),2^(-2)...依此类推

好的 我们知道了5.5的二进制码为101.1,这里将101.1转换为科学计数法就是1.011*2^(-2)

那么符号是啥呢,正号!那么就这样存储 (-1)^0*1.011*2^(-2)

让我们来观察下这组数据的存储格式,发现

有表式符号的 0(负数)或1(正数) 有表式有效数字的1.011 有表示数位的 -2

在浮点数中:称符号位为S,数位为E,有效数字为M

注:绿色为64位(double精度 以下为float类型举例

符号位存储使用1个bit大小 这很好理解,0为正数1为负数

有效数字使用23个bit大小 因为有效数字为1.xxxxx所以我们舍去1的存储,仅在内存中存入xxxx在取出的时候再加入1即可

数位使用8bit大小,因为E中存在有符号情况,而为了表示的数字更多,我们不使用第一位作为符号位的情况,将数据+127后进行存储(如上面的-2 我们存入内存中为125)

数据取出:

了解完了如何存储,那如何取出呢

如上方5.5的例子:

在内存中存储为 10000001 01100000000000000000000000000000

在16进制中表示为 40 B0 00 00

将这个数据取出,

符号位S直接取出,为0

M也直接取出后在前面直接写上1.即可

E就有点麻烦了:

        分为三种情况 第一种情况不为全一或者全零则讲该数据直接-127取出即可

                               第二种情况为全一,此时为2^8=256-1=255 哪怕减去127也为2^128 有点太大了,所以我们直接将这种情况写为无穷(正负仍看符号位)

                                第三种情况为全0,此时1-127=-128 ,2^-128太小了,无穷小,所以我们直接补上符号位,也不再写1.x而是直接写上0.x

例子:

所以开头的例子输出应该为:

9

第二个变为浮点数存储

000000000000000000001001 此时E为0 变为无穷小 所以输出为0.00000

第三个结果在内存中以浮点数存储 输出9.0

但第四以整数的形式去读取浮点数存储

所以 9.0=1001=(-1)^0*1.001*2^(3)

10000010 00100000000000000000000000000000

所以输出的结果为10104000000000

完结撒花:

🌈本篇博客的内容【浮点数在内存中的存储】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

http://www.lryc.cn/news/7736.html

相关文章:

  • Spring框架源码(五) @configuration源码深度解析
  • gcc/g++从入门到精通(3)gcc头文件、库搜索路径方式全面盘点
  • Android Studio多渠道打包及自动化构建
  • 基于MATLAB的MIMO信道估计(附完整代码与分析)
  • Python代码游戏————星球大战
  • java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据
  • Java基础知识快速盘点(二)
  • 企业降本增效的催化剂:敏捷迭代
  • MySQL入门篇-MySQL高级窗口函数简介
  • 什么是 API(应用程序接口)?
  • 如何在外网访问内网的 Nginx 服务?
  • vue2中defineProperty和vue3中proxy区别
  • 将bean注入Spring容器的五种方式
  • C生万物 | 常量指针和指针常量的感性理解
  • python 打包工具 pyinstaller和Nuitka区别
  • Python解题 - CSDN周赛第28期
  • DNS记录类型有哪些,分别代表什么含义?
  • ICLR 2022—你不应该错过的 10 篇论文(上)
  • HydroD 实用教程(三)环境数据
  • 第四章 统计机器学习
  • Redis第一讲
  • Java面试题-消息队列
  • 基于离散时间频率增益传感器的P级至M级PMU模型的实现(Matlab代码实现)
  • 9个相见恨晚的提升办公效率的网站!
  • java的双亲委派模型-附源码分析
  • Docker 笔记
  • 用户认证-cookie和session
  • UUID的弊端以及雪花算法
  • 使用netty+springboot打造的tcp长连接通讯方案
  • 【正点原子FPGA连载】第十章PS SYSMON测量温度电压实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南