三分钟带你了解浮点数的存储方式

首先我们先来看一下下面这段代码。

 

 通过对比①与③所打印出来的结果,可以知道浮点型和整型数据在内存中的存储方式并不相同。这里我们将浮点数float_n转化为(-1)^S*M*2^E这种形式来观察

 

  • ​​​​​​​其中(-1)^S表示符号位,如果S=0,则表示该浮点数为正数;当S=1时,浮点数为负数。
  • M为有效数字,M大于等于1,小于2
  • 2^E表示指数位

所以十进制的5转化为二进制就是101.0,按照上面所说的进行转化,就是1.01*2^2;十进制的-5转化后就是-1.01*2^2。

接下来我们再来看一下小数,比如5.5,因为0.5等于2的-1次方,所以将5.5转化为二进制就是101.1,再用刚才的公式进行转化,其结果就是(-1)^0*1.011*2^2。

通过上面式子的转换,我们就知道了S,E,M的大小,那么我们就可以将这些数据存储了,它们的存储方式就如下图所示。

 

前面说过1≤M<2,所以m的整数位总为1,因此规定在存储M的时候可以将m暂时舍去,只保存小数部分,等到使用时再把它加上,这样我们就能多存储一位了。

至于E我们这里将他看做一个无符号数,那么肯定会有人疑问,当E为负数时,肯定就会出现问题了呀。因此IEEE 754规定:存入内存E的真实值必须要加上一个中间数,对于8位数的E,中间数为127,11位的E,中间数为1023。就比如8bit的E真实值为1,那么存入的就是128,如果真实值是-1,那么存入的就是126。

我们用5.0这个数来验证一下③

 

 既然存入了E,那么我们在使用时肯定也需要将其拿出来,而这又分为了三种情况

  1. E不为全0或全1,这种情况我们就可以按存入时相反的操作取出
  2. E为全0,此时E不再加上之前所舍去的1,而是还原为0.xxx的小数,这种情况表示±0或是很小的数字
  3. E为全1,这时如果M全为0,那么表示±无穷大

这样我们就能知道②打印全为0的原因就是E全为0了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的浮点数使用IEEE 754标准来进行存储。IEEE 754标准规定了浮点数的表示方法,包括浮点数的符号位、指数位和尾数位。 在C语言中,浮点数使用float和double两种数据类型进行表示。float类型占用4个字节,double类型占用8个字节。 浮点数存储方式可以分为三个部分: 1. 符号位(Sign):浮点数的符号位用一个bit来表示,0表示正数,1表示负数。 2. 指数位(Exponent):浮点数的指数位用一定的位数来表示。在float类型中,指数位占用8个bits,而在double类型中,指数位占用11个bits。指数位的值通过偏移码来表示,偏移码是指将真实的指数值加上一个偏置值,这个偏置值在float和double类型中分别是127和1023。指数位的值表示了浮点数的数量级。 3. 尾数位(Significand or Mantissa):浮点数的尾数位用一定的位数来表示。在float类型中,尾数位占用23个bits,而在double类型中,尾数位占用52个bits。尾数位的值表示了浮点数的精度和小数部分。 浮点数的实际值可以通过以下公式计算得到:实际值 = (-1)^符号位 × (1 + 尾数位) × 2^(指数位 - 偏置值)。 浮点数存储方式使得它可以表示非常大和非常小的数,并且具有一定的精度。然而,由于浮点数存储方式以及精度问题,对于一些比较精确的计算,可能需要使用其他更为精确的数据类型或者进行一些特殊的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值