计算浮点数在内存中存储的2进制码(草稿)

作者在 2011-10-09 17:17:09 发布以下内容
在学《C程序设计(第4版)》。看到第50页,搞不明白实型数据的数据范围是怎么计算的,想知道实型数在内存里存储的2进制码是什么样的,看到一篇博文http://blog.csdn.net/sandyzhs/article/details/4275765讲到了一点,里面的程序对我来说有点高深看不大懂,自己试着编了一个比较笨的,功能也没完全实现。先记录下来回头慢慢学
/*
时间:2011年10月9日17:04:25
功能:输入一个float型数,输出其在内存中存储的2进制码
备注:输入0时的输出状态不对
*/
# include <stdio.h>

int main()
{
    float x;
    int i;
    int e;
    int a[32];
    
    
    printf("输入浮点数:\n");
    scanf("%f",&x);
    
    if (x>=0.0)        //符号位表示浮点数的正负
    {
        a[0]=0;
    }
    else
    {
        a[0]=1;
        x = -x;
    }
    
    if (x<=1.0)
    {    
        for(e=0; e>-128; --e)        //规定尾数必须是一个大于1小于2的小数(比如1.25)
        {
            if(x>=1.0 && x<2.0)
            {
                break;
            }
            x *= 2.0;
        }
    }
    else
    {
        for(e=0; e<128; ++e)
        {
            
            if(x>=1.0 && x<2.0)
            {
                break;
            }
            x /=2.0;
        }
    }
    
    x -= 1.0;        //这样的话系统默认有一个1,因此只需要存储后面的0.25(1就不需要存储了),0.25用二进制表示是0.01,再去掉(0.)就成为01。
    
    for (i=9; i<32; ++i)
    {
        x *= 2.0;
        if(x>=1.0)
        {
            a[i]=1;
            x -= 1.0;
        }
        else
        {
            a[i]=0;
        }
    }
    
    if(e>0)            //如果指数为0,则用01111 1111表示(即10进制的127,在此基础上加或减),比如1用1000 0000表示,-1用0111 1110表示。依此类推。
    {
        e = e-1;
        a[1]=1;
    }
    else
    {
        e = e+127;
        a[1]=0;
    }
    
    for (i=8; i>1; --i)
    {
        a[i] = e%2;
        e = e/2;
    }
    
    printf("SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM\n");        //S表示符号位,X表示阶数,M表示尾数
    for (i=0; i<32; ++i)
    {
        printf("%d",a[i]);
        if (3==i%4)
        {
            printf(" ");
        }
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入浮点数:
2.0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0100 0000 0000 0000 0000 0000 0000 0000
Press any key to continue

输入浮点数:
-2.0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
1100 0000 0000 0000 0000 0000 0000 0000
Press any key to continue

输入浮点数:
1
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1111 1000 0000 0000 0000 0000 0000
Press any key to continue

输入浮点数:
0.75
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1111 0100 0000 0000 0000 0000 0000
Press any key to continue

输入浮点数:
2.5
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0100 0000 0010 0000 0000 0000 0000 0000
Press any key to continue

输入浮点数:
0.1
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1101 1100 1100 1100 1100 1100 1101
Press any key to continue

输入浮点数:
0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0000 0000 -1000 0000 0000 0000 0000 0000
Press any key to continue
————————————
*/
 
默认分类 | 阅读 1325 次
文章评论,共0条
游客请输入验证码
最新评论