C语言的数据类型——基本数据类型————浮点数类型

我们这期文章讨论浮点数在内存中的存储方式。

我们以单精度浮点数(float)为例,它占用的内存为4字节。

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:(-1)^S * M * 2^E  ,其中(-1)^S表示符号位M表示有效数字,大于等于1小于22^E表示指数位。

按照上述规则这样,计算机就可以知道三个数值并且计算出我们需要的那个浮点数了。以为他们三个数值是一个整体,我们就需要把他们存放在一段连续的空间,那么在内存中这个数值的存储形式就是下图这样

  继续以单精度(float)为例,

符号位只需要一个比特位就可以表示正负,所以符号位占用大小位一个bit。当S为0表示正数S为1表示负数。举个例子例如-1.0

剩余的31个bit位留给有效数字和指数位。单精度浮点数(float)的有效数字占用23个bit位,指数位占用了8个bit位;8字节的双精度浮点数(double)的有效数字占用52个bit位,指数位占用11个bit位。

指数位(E)有效数字位(M)均视为无符号整数

(-1)^S * M * 2^E  有效数字(M)是大于1小于2的数字。这样的话就又出现了不必要的浪费。聪明的科学家干脆把有效数字的整数部分默认为1内存中只保留小数部分例如1.011******,内存中存储的无符号数值为011******(实际上是20位*),很巧地又为存贮节约了1个bit位的空间。

比如5.0转换为2进制是0101。根据公式,(-1)^S * M * 2^E 。S为0;M则为1.01;E则为2。整数1省略那么在内存中就应该是

关于指数位,我们知道了它占用了无符号的8bit位那么他的取值是0~255,然而实际需求中指数是存在负数的情况的,聪明的科学家规定存入内存的指数的真实值必须加上一个中间数,对于float(8bit位)是127,对于double(11bit位)这个值为1023。例如二进制浮点数0.1转化成公式{(-1)^S * M * 2^E}(-1)^0*1*2^(-1)

这时指数位(E)的值就是   真实值(-1)+中间数(127)=(存入内存的值)126。

126转换为二进制

接下来我们来做一个练习例如浮点数5.5

实际上并不是全部浮点数都能完全的转化成为二进制数例如1.3,转换以后只能接近十进制的1.3。

 

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

也很忙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值