1.浮点数在内存中的存储
根据国际标准 IEEE(电气和电子工程协会)754,任意一个二进制浮点数v可以表示成
1. (-1)^S * M * 2^E
2.(-1)^S:表示符号位,当S=0时,v是正数,当S=1时,v是负数。
3.M表示有效数字,大于等于1并且小于2.
4.2^E是指数位
什么意思呢 举个例子
float a=5.5;
a=5.5(十进制)
a=101.1(二进制)= 1.011*2^2 = (-1)^0 * 1.011 *2^2
这时候S=0 M=1.011 E=2
2.浮点数存储模型
1.单精度浮点数的存储模型(float)
S (1bit) | E(8bit) | M(23bit) |
因为E有正负两种情况 所以规定 E=E+127
eg: float a=0.5;
a=0.1(二进制) =1*2^-1 这时候E是-1
1.因为M 大于等于1并且小于2.所以规定转换后的小数点前的1,在内存中省略
2.当M不足23位时,后面补0
举个例子
float a=5.5;
a=5.5(十进制)
a=101.1(二进制)= 1.011*2^2
= (-1)^0 * 1.011 *2^2
=0 10000001 01100000000000000000000
S E M
所以a在内存中的存储的二进制形式就是0 10000001 01100000000000000000000
2.双精度浮点数的存储模型(double)
S (1bit) | E(11bit) | M(52bit) |
因为E有正负两种情况 所以规定 E=E+1023
eg: float a=0.5;
a=0.1(二进制) =1*2^-1 这时候E是-1
1.因为M 大于等于1并且小于2.所以规定转换后的小数点前的1,在内存中省略
2.当M不足23位时,后面补0
3.浮点数读取
int n=9;
float* p=(float*)&n;
printf("%f",*p);
-------------------------------------------------------------
存储(以int存进去)
n=9
=00000000 00000000 00000000 00001001
----------------------------------------------------------------
取出(以float取出)
00000000 00000000 00000000 00001001
=0 00000000 00000000000000000001001
这时候E为全0
=(-1)^0 * 0.00000000000000000001001 * 2^1-127
printf("%f",p);=0.000000
int n=9;
float* p=(float*)&n;
*p=9.0;//以浮点数的形式存进去
printf("%f",*p);//以浮点数的形式输出
-----------------------------------------------------------
存储(以float存进去)
n=9
n=1001(二进制)
n=(-1)^0*1.001*2^3
n=0 10000010 00100000000000000000000
------------------------------------------------------------
取出(以float取出)
n=0 10000010 00100000000000000000000
n=(-1)^0*1.001*2^3
printf("%f",*p);=9.000000
4.注意
当E为全0时
这时候规定浮点数的指数E等于1-127(或者1-0123) 即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxxxxxxx的小数,这样做是为了表示+-0,以及接近于0的很小的数字。
E为全1时
这时 如果有效数字M全是0,表示+-无穷大(正负取决于符号S)