我们平时常见的浮点数一般有3.14159这类型,这种叫字面浮点型,还有一种类型就是科学计数法的表示,例如1E10,表示的是1.0乘10的10次方。当然在浮点数的后面可以加上f,加上f就是float类型,不加 f 的话就是double类型。
当然这里我们可以在VS编译器底下看看float的头文件里面是如何定义浮点数表示的范围,像下图这样操作:
由上图中就可以看到浮点型对应相关的数据如最大值、最小值、精度这些定义,那么关于整型类型的范围定义就在头文件limits.h里面,大家也可以去探讨一下。
了解了这些额外的知识点后,言归正传,我们来探讨浮点型在内存中是如何存储的,首先给上一段代码例子和大家结合讨论,代码如下:
#include<float.h>
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;
}
这里首先先创建了一个n变量,里面存的是9的补码,然后n被取地址,拿出来这个地址后把其强制类型转换成(float*),此时地址没发生变化,只是类型被强制转换了,然后再把这个地址放入到pFloat浮点指针中:
那么此时我们可能绝大部分人会认为这段程序运行后的结果分别是9、9.0、9、9.0,那么到底是不是这么直观的结果呢,我们不妨运行程序来验证一下结果:
结果跟我们想像的结果大有差异,只有第一个结果是对了,那么先来讲一讲第四个结果为什么是9.000000,是因为在我们用%f或者%lf来打印,都会默认打印成小数点后6位的数。
现在我们知道第一个打印n是9是因为存进去的是一个整型,拿出来打印的也是一个整型,所以没有什么变化,结果没问题。
那么看到第二段打印的代码,我们存进去的依然是一个整型,但是拿出来的时候是以浮点型的形式拿出来打印,结果并不是我们所猜的答案9.0,所以这里我们可以基本的推断出浮点型和整型在内存中的存储方式是有所区别的。
这里再看到第三段打印代码,这里是以浮点型的方式存进去,用整型的方式拿出来打印,此时得出来的结果又不是我们想象中的数字9,所以这个地方再次说明了浮点型和整型在内存中的存储方式是不一样的。