什么叫做浮点数,就是有小数的数据就要浮点数,比如:5.5 6.5 9.0等一些数据就叫浮点数,那么浮点数又是怎么在内存中存放的呢,下面听我一一道来。
浮点型数据在内存中的存储
浮点型的家族包括:float double long double
我们以以下代码为例比较下浮点数和整型数据内存中的存储是如何的:
#include<stdio.h> int main() { int n = 9; float* p = (float*)&n; printf("%d\n", n); printf("%f\n", *p); *p = 9.0; printf("%f\n", *p); printf("%d\n", n); return 0; }
打印的结果如下:
由此可以看出浮点数和整型数据在内存中的存储方式是不一样的。
浮点数在内存中的存储规则
浮点数的存储是,根据国际标准IEEE(电子和电气工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
- (-1)S*M*2E
- (-1)^S表示符号位,当S=0,V为正数,当S=1,V为负数
- M表示有效数字,大于等于1,小于2
- 2^E表示指数位
- IEEE754规定:
对于32位浮点数,也就是float类型,即单精度浮点数。是这样规定的:
- 最高的1位是符号位S
- 然后是接下来的8位是指数E
- 最后剩下的23位为有效数字M。
- 对于64位浮点数,也就是double类型,即双精度浮点数。是这样规定的:
- 最高的1位是符号位S
- 然后是接下来的11位是指数E
- 最后剩下的52位为有效数字M。
IEEE754特别规定
M的取值范围1<=M<2,即M可以写成1.XXXXX的形式,其中.XXXXXX表示小数位。有以下规定:
当存放有效数字M时不存小数点前面的1,其目的就是提高类型的精度。
指数E的存储
E为无符号整数
E为8位,取值范围为0~255
E为11位,取值范围为0~2047
科学计数法中E可以出现负数,比如:
在把指数E存入内存中时需要加上一个中间数,8为E加上127,11为E加上1023。
取出指数E
E为全0
这时候不需要计算了,这是一个无限接近0的数,所以我们直接当成0
E为全1
这时,如果有效数字M全为0,表示正负无穷大。
当不为全0或不为全1
浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。