【浮点数的存储】

发布于:2022-12-14 ⋅ 阅读:(261) ⋅ 点赞:(0)


前言

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


一、引例描述

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

代码如下(示例):

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;
}

*题目分两个部分:
第一部分给出整形变量 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在内存中的存储形式:
在这里插入图片描述

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


总结

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

本文含有隐藏内容,请 开通VIP 后查看