zoukankan      html  css  js  c++  java
  • C语言中浮点数在内存中的存储方式

    关于多字节数据类型在内存中的存储问题
    ////////////////////////////////////////////////////////////////
    int ,short 各自是4、2字节。他们在内存中的存储方式以下举个样例说明。


    int data = 0xf4f3f2f1;
    当中低位存放在编址小的内存单元,高位存放在编址高的内存单元
    例如以下:
    地址:0x8000      0x8001    0x8002   0x8003
    数据:   f1              f2            f3          f4

    //上面是小端模式,还有大端存储模式
    //////////////////////////////////////////////////////////////////////////
     
    //////////////////////////////////////////////////////////////////////////
    依据IEEE在1985年制定的标准来处理浮点数
    单精度浮点数用4字节,包含1位符号位s(整数为0,负数为1),8位指数位e。23位有效位f
    浮点型使用的是科学计数法,比方十进制的12345能够表示为1.2345 * 10^4(表示10的4次幂)
    用二进制表示为 1.1000000111001 * 2^13
    所以计算机中用浮点数表示12345这个十进制应该是这种,s位为0,由于是正数。指数位为13+127=140(127为单精度浮点数偏移值,为了表示仅仅有小数部分的数)。有效位为1000000111001
    计算的时候用 (-1)^s * 1.f * 2^(e-127) ,结果就是 1* 1.1000000111001 * 2^(140-127=13) 。和我们刚才表示的一样
    还比方,十进制小数0.125转换为二进制小数0.001能够表示为 1* 1.0 * 2^(124-127=-3)
    double,双精度浮点数有1位符号位、11位指数位和52位有效数

    知道公式
    n=(-1)^s*m*2^e
    e=|E|-bias
    bias = 2^(k-1)-1(k为E的位数)
    m=|1.M|


    知道12345在内存中的10进制表示以后
    0x4640e400 = 0(100 0110 0)<100 0000 1110 0100 0000>
    括号里的数字为|E| = 140 所以e=140-127=13
    尖括号里的数字为m=|1.M|=|1.100000011100100|=1.506958008
    ok,
    代入公式n = (-1)^0*1.506958008*2^13=12345
  • 相关阅读:
    noip2016组合数问题
    noip2017奶酪
    洛谷1091合唱队形
    洛谷P1075 质因数分解
    洛谷1004方格取数
    POJ2393奶酪工厂
    NOIP2012国王游戏(60分题解)
    洛谷1106删数问题
    洛谷1209修理牛棚
    二维树状数组区间修改+区间查询模版
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7040310.html
Copyright © 2011-2022 走看看