• 整形数据和浮点型数据在内存中的存储差别


    愿所有美好如期而遇



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

    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,表示一个非常大的数据。

  • 相关阅读:
    瞅一瞅JUC提供的限流工具Semaphore
    Nginx-动静分离与 URLRwrite
    FuseDream论文阅读笔记 文本生成图像 text2image
    一篇博客搞定移动端布局
    uniapp使用抖音微信自定义组件
    NIO的浅了解
    仅用5000行代码,在V853上AI渲染出一亿幅山水画
    Uniapp + SpringBoot 开发微信H5项目 微信公众号授权登录 JAVA后台(一、配置使用微信公众平台测试公众号)
    上架用的SDK三方应用隐私
    tf.ones_initializer
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/134439170