• 浮点数的存储


    浮点数家族包括float,double和long double类型。浮点数字面值在缺少情况下都是double类型,除非它后面跟一个L或者l表示它是一个long double类型的值,跟一个F或者f表示它是一个float类型。

    对于IBM-PC而言,单精度浮点数是32位的,双精度浮点数是64位的。

    一个浮点数a由两个数m和e来表示:a = m × b^e。m(尾数),如果m的第一位是非0整数,称作规格化的。在计算机中一个浮点数的表示结构如下:

    1.含小树的浮点数表示为二进制

    假设要转换的数位123.456f:

    首先将整数部分转化为二进制:1111011

    然后将小数部分转化为二进制,可以通过乘以2的方式得到,如果乘以2小于0,对应位为0,否则对应位为1

    .456转化为二进制为:01110100101111001

    所以,123.456的二进制表示为:1111011.01110100101111001,右移6位,得到 1.111011 01110100101111001*2^6

    阶码为6,加上127得到131,二进制表示为10000101,那么总的二进制表示为:0  10000101  11101101110100101111001

    符号位

      0

      阶码

    10000101

            位数

    111011 01110100101111001

    表示成十六进制是  42  F6  E9  79

    2.将纯小数转化为二进制

    对于纯小数转化为二进制来说,必须首先进行规格化,对于0.0456,我们可以表示为1.4592乘以以2为底的-5次方的幂,即1.4592 * ( 2-5 )。转化为这样形式后,再按照上面处理小数的方法处理,得到二进制表示

    1. 01110101100011100010001

    去掉第一个1,得到尾数

    01110101100011100010001

    阶码为:-5 + 127 = 122,二进制表示为

    0  01111010  01110101100011100010001

    最后转换成十六进制
    11 C7 3A 3D

    3.将纯整数表示为浮点数

    假设要转换的数据时45678.0f

    直接将整数部分转化为二进制表示:1011001001101110.0

    然后将小数点向左移,一直移到离最高位只有1位,也就是 1.011001001101110,一共移动了16位,我们知道,左移位表示乘法,右移位表示除法。所以原数就等于这样:1.011001001101110 * ( 215 )。现在尾数和指数都出来了。因为最高位的1是根据标准加上去的,只是为了满足规格化的要求,这时候需要把这个1去掉。尾数的二进制就变成了:011001001101110。

    最后在尾数的后面补0,一直到补够23位,就是:01100100110111000000000。

    再回来看指数,根据前面的定义,P-127=15,那么P = 142,表示成二进制就是:10001110。

    45678.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来,就是:0 10001110 0110 0100 1101 1100 0000 000

    最后转换成十六进制:

    47 32 6E 00

  • 相关阅读:
    Java学习01-使用maven插件tomcat搭建web maven项目
    Anaconda3安装及使用
    python标准日志模块logging及日志系统设计
    python traceback捕获并打印异常
    python time
    PIL 中的 Image 模块
    python zipfile使用
    PHP 判断用户是否手机访问
    php数组相加 两个数组键名相同 后者不能覆盖前者
    解决Ubuntu Server 12.04换了网卡MAC地址后 网络不可用的问题.
  • 原文地址:https://www.cnblogs.com/sanshuiyijing/p/3028077.html
Copyright © 2020-2023  润新知