C语言-浮点数在内存中的存储

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) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值