• IEEE 二进制浮点数的表示


      朋友在谈一个物流相关的项目,是以前项目的一个延续,涉及到后台的扩展,手机端的App,外加两个App的对接的蓝牙打印机。这个项目前后说了一个多月了吧,最近才草拟了协议。项目本来不复杂,但是客户却如此的拖延。我觉得客户做事好慢,而朋友觉得是自己的就是自己的,不是自己的急也没有用。不断的打电话询问客户,可能最后还被压价,反而更没办法做了。他其实比我还急,但是人家的心态好。的确凡事急不得。

    浮点数

      在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。这几种浮点型所容纳的长度不同,当然它们存储的精度也就不同了。

      对于整形而言,比如 int 、short 、char 之类的,在内存中的存储方式都是用 补码 进行表示。而浮点数在内存中并没有使用补码进行表示。浮点数在内存中存储的方式使用了 IEEE 的编码表示方式,即使用 符号指数 和 尾数 的形式进行存储的。

    IEEE浮点数表示

      用 IEEE 编码表示浮点数,需要 3 部分进行表示,分别是 符号指数 和 尾数。符号位占用 1 位,0 表示正数,1 表示负数。指数 和 尾数 根据 float 和 double 类型的不同而长度不同。

      

      IEEE 二进制浮点数的表示:

    位数  符号位  指数位  尾数位
    32     1            8           23     单精度(float)
    64     1           11          52     双精度(double)

    编码转换

    以单精度为例:把3.75用IEEE表示法表示

    1、把 10 进制转换为2进制:3.75D=11.11B

    2、 尾数正规化                     1.111*2^1

    3、 修正指数                         1+127=128 1000 0000

    4、 符号 0表示正,1表示负

    5、 IEEE表示                         0 1000 0000 1110 0000 0000 0000 0000 000

    6、 转换为16进制:              0100 0000 0111 0000 0000 0000 0000 0000   40 70 00 00 

    用 C 程序进行验证

      写一个简单的 C 程序来验证上面的转换,代码如下:

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     float f = 3.75f;
     6 
     7     printf("%f 
    ", f);
     8 
     9     return 0;
    10 }

      以上代码用 VS 2012 编译,调试运行查看内存,如下图所示。

      图中的00 00 70 40是以小尾方式存储的,其值为40 70 00 00,与我们手动转换的值相同。


    我的微信公众号:“码农UP2U”

  • 相关阅读:
    02 微服务应用的认证与授权
    01 微服务架构中的服务发现作用以及两种协议的调用区别
    04 redis的数据结构与对象
    03 Spring的事务管理的基本使用
    02 Spring的AOP的基础概念与简单使用
    k8s环境部署
    elk安装
    实现AD域验证登录--
    linux SSH各配置项解释
    Linux学习之SAMBA共享(密码验证)
  • 原文地址:https://www.cnblogs.com/tosser/p/9312644.html
Copyright © 2020-2023  润新知