float和double的内存布局

本文详细介绍了二进制数如何表示十进制数,包括整数与小数部分的具体转换过程。此外,还深入探讨了计算机中double类型变量的内部存储结构,解释了为什么某些十进制数不能被double精确表示的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/yaozhongxiao/archive/2010/09/08/1821185.html

http://blog.youkuaiyun.com/demon__hunter/article/details/3566232

已经有人写好了,我就不写了。

一个人,只认识二进制,他要表达十进制中的9,需要写成1001,换算公式为1*2^3+0*2^2+0*2^1+1*2^0=9。

他要表达十进制中的9.5,需要写成1001.1,换算公式为1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)=9.5。

如果有一个二进制为1001.1001,它是十进制中的1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)+0*2^(-2)+0*2^(-3)+1*2^(-4)=9.5625。

=========================================

double占64bit,其中符号位1位,指数位11位,小数部分52位,指数偏移量是1023。
小数部分是指【yyy.xxx】,其中xxx是52个零壹字符串。
当偏移量为正值(大于0)时,小数点右移偏移量个位置。
当偏移量为负值(小于0)时,小数点左移偏移量个位置。
当偏移量为0时,小数位的值=(0/1)*2^(-1)+(0/1)*2^(-2)+(0/1)*2^(-3)+...+(0/1)*2^(-52)。
当我们把2^(-52)作为一个单位时,小数位的值就是xxx(共52个x的零壹字符串)个单位。
所以,小数位的值value=multiple*2^(-52)。
所以multiple=value*2^52。
因为2^52=......370500,所以,value为0.01的倍数的时候,multiple都是整数。
所以,double可以完美的表示所有的两位小数。
但是double d=17.7时,VS2013显示的是17.699999999999999,这很令人诧异。

====================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值