• 【浮点数的存储】



    前言

    大家好,我是熊猫,今天我们来讨论一下浮点型数据在内存中的存储形式。


    一、引例描述

    在讲解开始之前我们先来想一下这个程序的输出结果。

    代码如下(示例):

    int main()
    {
    	int n = 9;
    	float* p = (float*)&n;
    	printf(" n的值为:%d\n", n);
    	printf("*p的值为:%f\n", *p);
    	*p = 9.0;
    	printf(" n的值为:%d\n", n);
    	printf("*p的值为:%f\n", *p);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    *题目分两个部分:
    第一部分给出整形变量 n = 9;之后取出n的地址并强制类型转换为浮点类型的指针并赋值
    最后分别以%d与%f的形式输出
    第二部分给出 p = 9.0;最后同样以%d与%f的形式输出。
    看到这种题,如果不执行程序的话我想肯定会有小伙伴会认为:结果肯定还是9啊,无非就是以%f形式打印的数字结尾会有一串的“0尾巴”。

    运行结果如下:
    在这里插入图片描述

    看到这样的结果,大家会不会感到迷惑呢?为什么一个值为0.00,另一个值又为什么会是如此大的一个数字呢?


    二、题目解析

    我们大家应该知道,整形在内存中的存储形式为:原码、反码和补码;
    而整形是没有小数位的,在相应等取值范围内,不伦多大的数值都可以用有对应的二进制表示出来,
    可是我们的浮点型数据具有小数位,
    比如8.5,用二进制表示就是 1000.1,最后的1为2的-1次方既0.5;
    再比如5.125 用二进制表示就是 0101.01,最后的1为2的-2次方既0.125;
    以上两个例子用二进制表示貌似也很方便,
    可是如果有数字5.1用二进制表示为:0101.00110010110101…
    这里我们可以看出0.1用二进制是不能完整表示出来的,那么我们应该怎么解决呢?
    答案是:无法解决!
    大家听到这句话是不是很惊讶呢,我们这么“神通广大”的计算机居然连一个小数都存储不起来?
    我们的计算机在存储数据时都是以它的二进制形式进行存储的,这里的小数无法具体表示确实无法解决,不过我们可以让它的二进制小数位尽可能多地存储起来,这样就可以使得数据存储地更加准确。

    具体存储形式如下:
    在这里插入图片描述
    在这里插入图片描述

    整数9 和 浮点数9.0:
    在这里插入图片描述


    三、知识补充

    double在内存中的存储形式:
    在这里插入图片描述

    正是由于整形与浮点型数据在内存中的存储形式的不同才会出现那些不尽相同的结果,
    所以那些按位运算符(&,|,^,~)与移位运算符(>>,<<)都是只适用于整形数据的。


    总结

    以上就是熊猫对这个题目的理解,
    在此感谢大家对的支持,这是熊猫持续更新的巨大推进力!

  • 相关阅读:
    JavaFX Scene Builder Menu 控件详解
    MAVEN——PACKAGE、INSTALL、DEPLOY的联系与区别
    OpenCV第二篇:读取图像和保存图像
    链表专项练习(二)
    进程间通信之共享内存
    产业互联网的内在逻辑就是借助新技术的方式来改造传统
    ES6如何声明一个类?类如何继承?
    MP3文件的构成
    【论文阅读】PSDF Fusion:用于动态 3D 数据融合和场景重建的概率符号距离函数
    数字相控阵Matlab仿真
  • 原文地址:https://blog.csdn.net/m0_66363962/article/details/126324057