技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 编程语言 --> 浮点数的二进制表示

浮点数的二进制表示

浏览:2539次  出处信息

    1.

    前几天,我在读一本C语言教材,有一道例题:

      #include

      void main(void){

        int num=9; /* num是整型变量,设为9 */

        float* pFloat=# /* pFloat表示num的内存地址,但是设为浮点数 */

        printf(\"num的值为:%d\\\\n\",num); /* 显示num的整型值 */

        printf(\"*pFloat的值为:%f\\\\n\",*pFloat); /* 显示num的浮点值 */

        *pFloat=9.0; /* 将num的值改为浮点数 */

        printf(\"num的值为:%d\\\\n\",num); /* 显示num的整型值 */

        printf(\"*pFloat的值为:%f\\\\n\",*pFloat); /* 显示num的浮点值 */

      }

    运行结果如下:

      num的值为:9

      *pFloat的值为:0.000000

      num的值为:1091567616

      *pFloat的值为:9.000000

    我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

    要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我的笔记。

    2.

    在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。

      int num=9;

    上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000 00000000 00000000 00001001,写成16进制就是0x00000009。

    那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?

    3.

    根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

      V = (-1)^s×M×2^E

      (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

      (2)M表示有效数字,大于等于1,小于2。

      (3)2^E表示指数位。

    举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

    十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

    IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

    

    对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

    

    5.

    IEEE 754对有效数字M和指数E,还有一些特别规定。

    前面说过,1≤M

建议继续学习:

  1. [python]定制JSON中的浮点数格式    (阅读:2983)
  2. 删除查看二进制日志    (阅读:2825)
  3. 编写安全代码:小心使用浮点数    (阅读:2715)
  4. 字体文件也属于二进制文件    (阅读:2540)
  5. 文本与二进制方式打开文件的区别    (阅读:2279)
  6. 二进制的二三事    (阅读:1845)
  7. 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)    (阅读:1677)
  8. Objective-C 对二进制数据 NSData 进行 URL 编码    (阅读:791)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1