float型数据在计算机中如何存储?

float型数据在计算机中如何存储?

参考链接:
https://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html
https://baike.baidu.com/item/科学记数法/1612882?fr=aladdin
https://www.jianshu.com/p/a103cfa0f6f0 (浮点数的移位存储)
补充资料:
https://moocaholic.medium.com/fp64-fp32-fp16-bfloat16-tf32-and-other-members-of-the-zoo-a1ca7897d407

二进制的科学记数法

百度百科定义: 科学记数法是一种记数的方法,把一个数表示成a与10 的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数),这种记数法叫做科学记数法。
上述定义的是人们常接触到的十进制科学记数法。例如十进制数123.5的科学记数法应表示为1.235*102。通用计算机一般采用二进制存储方式,不能直接识别十进制数,需要做进制转换。上述123.5的二进制表示为1 111 011.1,其对应的科学记数法表示为1.111 011 1 * 26。由于二进制科学记数法的整数位只能为1,故可缺省表示该位。

float型数据的存储方式

C语言和C#语言中,float(单精度浮点类型)数据占用32bit,遵从IEEE R32.24规范,具体分为3个部分:

  1. 1bit符号位(sign): 0 表示正数, 1 表示负数。
  2. 8bit指数位(exponent): 用于存储二进制科学记数法中的指数数据,范围是-127~128,并且采用移位存储。
  3. 23bit尾数部分(mantissa):科学记数法中的小数部分。由于整数位可缺省表示,实际表达的精度为24bit。

第2点中的移位存储的含义是:直接用二进制0000 0000 ~ 1111 1111表示-127~128,即设科学记数法中的指数值为x,指数位的值实际存储为 (127+x),对应关系示例如下:
0000 0000,表示-127;
倒推过程:1000 0001+0111 1111=(1)0000 0000,其中1000 0001为8位有符号数,表示-127。
0111 1111,表示0;
1000 0000,表示1;
1111 1111表示128.
倒推过程:1000 0000+0111 1111=1111 1111,有符号数的8bit的表示范围是-128~127,不能表达128。
综合上述结果的猜测:C语言float类型数据8bit指数位的表示中,可能在正整数时采用了无符号8bit数据类型,负整数时采用了有符号8bit数据类型。

二进制数1.111 011 1 * 26在内存中的表示为:

  1. 1bit 符号位的值为0
  2. 8bit指数位的值为(127+6)=133,即1000 0101‬
  3. 23bit尾数部分的值为1110 1110 0000 0000 0000 000
    (0) (1000 0101) (1110 1110 0000 0000 0000 000)
    即0100 0010 1111 0111 0000 0000 0000 0000
    该32bit数对应的十六进制表示为:0x 42 F7 00 00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值