当前位置 博文首页 > Oxygenant的专栏:浮点数的内存存储方式

    Oxygenant的专栏:浮点数的内存存储方式

    作者:[db:作者] 时间:2021-08-07 18:57

    #define ?GET(p)?(*(p)?|?(*(p+1)?<<?8)?|?(*(p+2)?<<?16)?|?(*(p+3)?<<?24))

    void ?printb(unsigned? int ?n)
    {
    ????unsigned?
    char?B[32]?=?{0,};
    ????
    bool?flag?=?false;
    ????
    ????
    int?j?=?0;
    ????
    for?(int?i=31;i>=0;i--)
    ????
    {
    ????????unsigned?
    int?p;
    ????????p?
    =?n?<<?31?-?i?>>?31;

    ????????
    if?(!flag)
    ????????
    {
    ????????????
    if?(p?==?1)
    ????????????
    {
    ????????????????flag?
    =?true;
    ????????????}

    ????????}
    ?
    ????????
    ????????
    if?(flag)
    ????????
    {
    ????????????B[j]?
    =?(p?==?1)?'1':'0';
    ????????????j?
    ++;
    ????????}

    ????}

    ????printf(
    "%s",B);
    }


    int ?main( int ?argc,? char * ?argv[])
    {
    ????
    float?f?=?-289.95;

    ????
    //单精度浮点
    ????unsigned?int?sign;//符号
    ????unsigned?int?significand;//有效位
    ????unsigned?int?exponent;//指数
    ????unsigned?int?floatbyte;
    ????unsigned?
    char?*?pfloat?=?(unsigned?char*)&f;
    ????
    ????floatbyte?
    =?GET(pfloat);
    ????
    ????sign?
    =?floatbyte?>>?31;
    ????exponent?
    =?floatbyte?<<?1?>>?24;
    ????significand?
    =?floatbyte?<<?9?>>?9;
    ????
    ????printf(
    "符号位:");
    ????printb(sign);
    ????printf(
    " 指数位:");
    ????printb(exponent);
    ????printf(
    " 有效位:");
    ????printb(significand);
    ????
    ????
    //输出结果
    ????printf(" 单进度浮点数为:");
    ????
    if?(sign?==?1)
    ????
    {
    ????????printf(
    "-");
    ????}
    ?else{
    ????????printf(
    "+");
    ????}

    ????
    ????printf(
    "1.");
    ????printb(significand);
    ????
    ????
    //这里只讨论指数为规范化值的情况,对于零和无穷大不讨论
    ????if?(int(exponent?-?127)?>?0)
    ????
    {
    ????????printf(
    "?>>?%d ",exponent?-?127);
    ????}
    ?else?{
    ????????printf(
    "?<<?%d ",127?-?exponent);
    ????}


    ????
    return?0;
    }

    cs