C/C++浮点数格式——IEEE754标准

按照IEEE754标准,浮点数的格式为,从最高位开始一次是:
数符S,阶码E,尾数M;数符是指这个数是正的,还是负的;
在计算机中一个任意进制数N可以写成:N=R的e次方 乘以m;R就是基数(在电脑中基数当然是2),e就是

阶码,m就是尾数

32为浮点数中,
S是浮点数的符号位,占一位,安排在最高位,S=0表示正数,S=1表示负数;
E是阶码,占用8位,阶符采用隐含方式,即采用移码来表示正负指数,采用这种方式时,将浮点数的指数

真值e变成阶码E时,应将指数e加上一个固定的偏移值127(01111111),即E=e+127;
M是尾数,占用23位,用小数表示,小数点放在尾数域的最前面,其实小数点前面还有一位1,只不过这个

1是不用写出来的,例如1.101001的尾数是101001,即M=101001,而小数点前面的1是规定不写的,这样做

只是为了扩大数的范围
例如32位的浮点数18.75 的二进制形式是:10010.11,
用IEEE754标准表示方法如下,
把小数点移动e位,使小数点左边只有一位有效数字1,这样e就是这个数的阶码的真值;对于这个数,把

小数点向左移4位,变成了1.001011,e=4,即真值阶码为4,则阶码E=e+127,用二进制表示为10000011,

E=10000011就是18.75这个数的阶码。这个数为正,因此数符位为0,18.75在计算机内的表示为
0 10000011 0010110 00000000 00000000
这样-18.75在计算中的表示为  1 10000011 0010110 00000000 00000000

下边这个程序在TC2.0下编译通过,作用是用二进制的形式输出一个浮点数在计算机的表示形式,在计算

机中高字节占据高地址,这里我取float f=-18.75输出的结果是1 10000011 0010110 00000000 00000000
你可以把它改为18.75输出看看结果

#include

void outBinary(unsigned char ch);


int main(void)
{
    float f=-18.75;
    unsigned char *p,ch;
    int i;
    p=(unsigned char *)(&f);

    clrscr();
    i=sizeof(f);
    printf("/nsizeof(float)= %d/n/n",i);
    for(i=sizeof(f)-1;i>=0;i--)
    {
        ch=*(p+i);
        outBinary(ch);
        putchar(' ');
    }
    return 0;
}

void outBinary(unsigned char ch)
{
    int i;
    for(i=0;i<8;i++)
    {
        if( (ch<        else putchar('0');
    }
}


对于64位浮点数(double)也是一样,只不过阶符用12位表示,其他的都一样

你可能感兴趣的:(C++)