1、浮点数是如何存储的
首先应先了解浮点数的存储方式。以float为例。float一共占4个字节,共32位。分为3部分:符号位、指数位和尾数位。分别占1位、8位和23位,存储结构如图1所示。
另外,double类型,8字节,共64位;符号位1位,指数位11位,尾数位52位;
2、如何把十进制浮点数转成二进制浮点数
例如:把20.5和20.3转成二进制浮点数
20.5 ->10100.1
首先把浮点数分成两部分,整数部分和小数部分,分别为20和0.5,20表示成二进制为10100
小数部分转成二进制的方法如下:
0.5X2 = 1.0(1) (小数部分的值乘以2所得的值再减去其整数部分的值)
0X2 = 0(0) ...
20.3 ->10100.0100110011001....
0.3X2 = 0.6(0)
0.6X2 = 1.2(1)
0.2X2 = 0.4(0)
0.4X2 = 0.8(0)
0.8X2 = 1.6(1)
0.6X2 = 1.2(1)
0.2X2 = 0.4(0)
0.4X2 = 0.8(0)
0.8X2 = 1.6(1)
..................
3、将浮点数存储在一组字节中
上面我们把浮点数转换成二进制浮点数,20.5表示成10100.1, 20.3表示成10100.010011001...
我们把二进制浮点数用科学计数法的形式表示,例如:
20.5 表示成 1.01001E(100) ->100 = 4
20.3 表示成 1.0100010011001...E(100)
根据上面的介绍,我们知道float和double浮点数在内存中是由三部分组成,那是如何定义这三部分的数 据的呢,下面以20.5和20.3介绍这三部分的数据是如何定义存储的。
例如:20.3 符号位0表示正数,1表示负数 ,因此符号位为0
指数位,根据上面科学计数法得知20.3的指数为100,但是指数并不是100,而在指数100加上对应值, float是127(01111111),double是1023(01111111111),因此得到的指数位是 10000011(float),10000000011(double)
尾数位,对应的就是科学计数的尾数,后面没有的补0,float(100000...)
4、如何将浮点数以二进制输出
#include <stdio.h>
#include <stdlib.h>
void main()
{
float f = 20.3;
unsigned int * n = (unsigned int *)&f;
for (int i=31;i>=0;--i)
{
printf("%d", (*n >> i & 1));
}
}