码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 整形数据和浮点型数据在内存中的存储差别


    愿所有美好如期而遇



    我们先来看代码,猜猜结果是什么呢?

    1. int main()
    2. {
    3. //以整型数据的方式存储
    4. int n = 10;
    5. float* m = (float*)&n;
    6. //以整型数据的方式读取
    7. printf("%d\n", n);
    8. //以浮点型数据的方式2读取
    9. printf("%f\n", *m);
    10. printf("----------------------------\n");
    11. //以浮点型数据的方式存储
    12. *m = 10.0;
    13. //以整型数据的方式读取
    14. printf("%d\n", n);
    15. //以浮点型数据的方式读取
    16. printf("%f\n", *m);
    17. return 0;
    18. }

    你是不是觉得答案是10   10.0   10   10.0 呢?

    那么我们接下来解释一下为什么是上面那个结果

    首先,整型数据和浮点型数据在内存中的存储方式是不同的

    (1)整型数据的存储方式是怎样的呢?

    在看下面的解释前,如果看不懂请参考:原码,反码,补码,char大小范围的解释

    整型数据在内存中直接转换为二进制后以补码形式存储。

    (2)浮点型数据的存储方式是怎样的呢?

    我们要对他的二进制分三部分去看,符号位,指数位,有效数字位(已经用空格分开)

    10.0我们可以写成(-1)^0 *1.0*10^1,(-1)^0,0就是符号位,正数为0,负数为1,1.0就是我们的有效数字,10^1,1就是我们的指数,但是float类型的数据指数在存储时需要加上127,double类型的数据指数在存储时要加上1023,这是IEE754的规定。

    而且他还规定了float的指数位有8位,有效数字位23,double指数位有11位,有效数字位52位。数位为unsigned int类型,恒为正数。

    指数为1 + 127 ,也就是128,转换为二进制也就是10000000,而有效数字位不存储1,在读取数据时自动前面补1,这样就节省了一位去存储有效数字,也就提高了精度。

    读取数据时如何读取?分三种情况:

    一:指数位不是全0也不是全1

    好比我们上面的10的二进制,我们读取时如何读取?

    先看符号位,是正数,然后看指数位,指数位减去127,也就剩下1,也就是10^1,再看有效数字位,全是0,也就是1.0000......,最后我们乘起来:(-1)^0   *   10^1    *    1.0

    二:指数位全是0

    那也就相当于我们原来的指数是-127,加上127后为0,那么指数位就是10^-127,这时,我们在读取时就丢掉有效数字位本来会加的那个1,直接用符号位乘指数以及后面的有效数字位。

    三:指数位全是1

    也就相当于是128+127,我们原本的指数位就是128,也就是10^128,表示一个非常大的数据。

  • 相关阅读:
    接口自动化测试 —— 协议、请求流程
    『 Linux | 1 』VMware上安装Ubuntu22.04
    为什么蛋白质如此重要?它可以帮助你自然地减肥!
    Java:Java vs .Net vs Python,选哪个好?
    【JVM技术专题】网络问题分析和故障排查规划指南「实战篇」
    【漏洞复现】酒店宽带运营系统RCE
    Google Earth Engine(GEE)——一个简单的影像波段时序折现图
    【C++】类和对象(四)“这三种”成员变量只能放在初始化列表中初始化,你都知道吗?
    Linux基础:文件权限详细说明(全)
    百战RHCE(第四十一战:linux高级应用-重置root密码)
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/134439170
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号