float在内存中的存储

以下内容来自于https://www.iteye.com/blog/hxraid-504293

1.十进制转二进制

1.1整数:

                     11/2=5   余   1

                       5/2=2   余   1

                       2/2=1   余   0

                       1/2=0   余   1

                          0结束         11二进制表示为(从下往上):1011

1.2小数:

                     0.9*2=1.8   取整数部分  1

                     0.8(1.8的小数部分)*2=1.6    取整数部分  1

                     0.6*2=1.2   取整数部分  1

                     0.2*2=0.4   取整数部分  0

                     0.4*2=0.8   取整数部分  0

                     0.8*2=1.6   取整数部分  1

                     0.6*2=1.2   取整数部分  0

                              .........      0.9二进制表示为(从上往下): 1100100100100......

从这里可以看出来,小数位数如果不是5,永远也取不完

2 float型在内存中的存储

float内存存储结构  

31                  30                   29-----23      22----0

实数符号位    指数符号位     指数位         有效数位

将一个float型转化为内存存储格式的步骤为:

     (1)先将这个实数的绝对值化为二进制格式,注意实数的整数部分和小数部分的二进制方法在上面已经探讨过了。
     (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
     (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。
     (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。
     (5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。
     (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。

 

       举例说明: 11.9的内存存储格式

       (1) 将11.9化为二进制后大约是" 1011. 1110011001100110011001100..."。

       (2) 将小数点左移三位到第一个有效位右侧: "1. 011 11100110011001100110 "。 保证有效位数24位,右侧多余的截取(误差在这里产生了 )。

       (3) 这已经有了二十四位有效数字,将最左边一位“1”去掉,得到“ 011 11100110011001100110 ”共23bit。将它放入float存储结构的第22到第0位。

       (4) 因为11.9是正数,因此在第31位实数符号位放入“0”。

       (5) 由于我们把小数点左移,因此在第30位指数符号位放入“1”。

       (6) 因为我们是把小数点左移3位,因此将3减去1得2,化为二进制,并补足7位得到0000010,放入第29到第23位。

           最后表示11.9为:  0 1 0000010 011 11100110011001100110

 

        再举一个例子:0.2356的内存存储格式
      (1)将0.2356化为二进制后大约是0.00111100010100000100100000。
      (2)将小数点右移三位得到1.11100010100000100100000。
      (3)从小数点右边数出二十三位有效数字,即11100010100000100100000放入第22到第0位。
      (4)由于0.2356是正的,所以在第31位放入“0”。
      (5)由于我们把小数点右移了,所以在第30位放入“0”。
      (6)因为小数点被右移了3位,所以将3化为二进制,在左边补“0”补足七位,得到0000011,各位取反,得到1111100,放入第29到第23位。
               最后表示0.2356为:0 0 1111100 11100010100000100100000

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值