以32位单精度浮点数为例,按IEEE 754规范的定义,使用32个位元来存储单精度二进制小数。
    
    ---------------------------------------------------------
    |   1  |        8              |     23 位长                 |
    ---------------------------------------------------------
    |   S  |       Exp          |     Fraction                 |
    ---------------------------------------------------------
    |  31  |     30至23      |    22至0位编号          |
    |        |  偏正值+127  | (从右边开始为0)   |
    ---------------------------------------------------------

    其中,S为符号位(0为正,1为负),Exp为指数位,Fraction为有效数位。
    指数部分即使用所谓的偏正值形式表示,实际值为表示值与一个固定值(32位的情况是127)的和。
    单精度的指数部分是-126~+127加上127,指数值的大小从1~254(0和255是特殊值)。
    浮点小数计算时,指数值减去偏正值将是实际的指数大小。
    
    例子:将浮点数6.91转换为十六进制数。
    
    1、将6.91转换成二进制形式,有效位长为31(8+23)
       -> 整数:6(10进制)   -- 110(2进制,实际位长为3)
       -> 小数:0.91(10进制)-- 111010001111010111000(2进制,实际位长21(23-3+1))
       
       小数转换为二进制的方法:小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。
       0.91 * 2 = 1.82 ... 1
       0.82 * 2 = 1.64 ... 1
       0.64 * 2 = 1.28 ... 1
       0.28 * 2 = 0.56 ... 0
       0.56 * 2 = 1.12 ... 1
       0.12 * 2 = 0.24 ... 0
       0.24 * 2 = 0.48 ... 0
       0.48 * 2 = 0.96 ... 0
       0.96 * 2 = 1.92 ... 1
       0.92 * 2 = 1.84 ... 1
       0.84 * 2 = 1.68 ... 1
       0.68 * 2 = 1.36 ... 1
       0.36 * 2 = 0.72 ... 0
       0.72 * 2 = 1.44 ... 1
       0.44 * 2 = 0.88 ... 0
       0.88 * 2 = 1.76 ... 1
       0.76 * 2 = 1.52 ... 1
       0.52 * 2 = 1.04 ... 1
       0.04 * 2 = 0.08 ... 0
       0.08 * 2 = 0.16 ... 0
       0.16 * 2 = 0.32 ... 0
       
       至此,6.91的二进制为:110.111010001111010111000

    2、将原始二进制值规范化:调整使其实数的第一位大于1小于2
       6.91 = 1.10111010001111010111000*2^2
       
    3、构造浮点数的二进制原型
        S: 0
        Exp: 2 + 127(10进制) = 129(10进制) = 10000001(2进制)
        Fraction: 10111010001111010111000 (注意:小数点前面的1不要了)
        
    4、重新组合并由二进制转换成十六进制
        0 10000001 10111010001111010111000
      = 0100 0000 1101 1101 0001 1110 1011 1000
      =  4    0    D    D    1    E    B    8

       即6.91的十六进制为0x40DD 1EB8

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐