1. 程式人生 > >C/C++浮點數格式——IEEE754標準

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<stdio.h>

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<<i) & 0x80) putchar('1');
        else putchar('0');
    }
}


對於64位浮點數(double)也是一樣,只不過階符用12位表示,其他的都一樣