zoukankan      html  css  js  c++  java
  • 浮点型数据在内存中的存储【转】

    转自Jackchenyj的博客

    还是挺容易理解的

    一、浮点型数据在内存中存储的表示

    实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的尾数。比如32位机上float型为23位(因为规范化数的数码最高位恒为1,不必存储,实际精度为24位,下面会有详解),double型为52位。

    单精度float型存储在内存中的大小为4个字节,即32位。

    xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

    浮点表示法类似于科学计数法,任一数均可通过改变指数部分,使小数点位置发生移动,如23.45可以写成:2.345*10^1

    浮点表示的一般形式为:R=M*2^e (R:Real M:Mantissa尾数 e:exponent阶码)

    把上面float的二进制可分成三部分:

    x        xxxxxxxx        xxxxxxxxxxxxxxxxxxxxxxx

    数符(1b)   阶码(8b)      尾数(23b)

    double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)

    数符sign:real的正负号 "+":0 "-":1

    阶码e:这里二进制其实是移码E(0~255)的表示,e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位,e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1

    尾数M:有效数字位,这里是有效数字位的部分二进制码,为什么说部分呢?仔细看通上下文就可以知道了。

    例1:

    float型浮点数125.5转化成32位二进制浮点数

    125.5的二进制码为1111101.1,写成二进制的科学计数为:1.111101*2^6(因为科学计数法“整数”部分大于1,在二进制中,“整数”部分只能恒为1)即向左移6位,则e=6,则E=e+127=133,而E的二进制码为10000101,而1.111101把“整数”部分去除1之后为111101,之后补0,共23b,形成了尾码。

    所以125.5的32位二进制浮点数为

    0 10000101 11110100000000000000000

    例2:

    float型浮点数0.5转化成32位二进制浮点数

    0.5的二进制码为0.1,写成二进制的科学计数为:1.0*2^(-1)即向右移1位,则e=-1,则E=e+127=126,而E的二进制码为01111110,而1.0把“整数”部分去除1之后为0,之后补0,形成了阶码。

    所以0.5的32位二进制浮点数为

    0 01111110 00000000000000000000000

    double型浮点数类似。

    二、  二进制转十字制

    例3:

    32位二进制浮点数为0 10000010 00010000000000000000000转化成十进制数浮点数

    题中已给我们分了三部分,数符部分、阶码部分、尾数部分。

    数符部分为0,则代表此数为整数;阶码部分为10000010,则E=130,则e=E-127=3,则说明其向左移了3位,0001加上“整数”部分的1之后,为1.0001。则原二进制数为1000.1=十进制8.5,或R=1.0001*2^3=8.5

  • 相关阅读:
    生活中头疼脑热及医生诊断用药相关,持续更新
    python3 面试题 英文单词全部都是以首字母大写,逐个反转每个单词
    python 代码如何打包成.exe文件(Pyinstaller)
    charles使用
    经典bug
    python3面试-查找字符串数组中的最长公共前缀
    python3面试题 按规律写出下一个数1,11,21,1211,111221
    python3 测试的时候如何批量随机生成伪数据?(faker模块的)
    python3面试题-一个包含n个整数的数组a,判断a中是否存在三个元素,a,b,c,使得a+b+c=0
    python3面试-将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列
  • 原文地址:https://www.cnblogs.com/yfzhang/p/3938878.html
Copyright © 2011-2022 走看看