C語言浮點數存儲結構分析

float類型的數據在內存中是如上存儲的,float類型的存儲方式以下(摘自博客 http://blog.csdn.net/yezhubenyue/article/details/7436624):spa

取原文中的部分總結以下:.net

  

浮點型變量在計算機內存中佔用4字節(Byte),即32-bit。遵循IEEE-754格式標準。code

  一個浮點數由2部分組成:底數M和指數E。  blog

  底數部分 使用2進制數來表示此浮點數的實際值。內存

  指數部分 佔用8-bit的二進制數,可表示數值範圍爲0-255。可是指數應可正可負,因此IEEE規定,此處算出的次方須減去127纔是真正的指數。因此float的指數可從 -126到128. 底數部input

分實際是佔用24-bit的一個值,因爲其最高位始終爲 1 ,因此最高位省去不存儲,在存儲中只有23-bit。 到目前爲止,底數部分23位加上指數部分8位使用了31位。那麼前面說過,float是佔用博客

4個字節即32-bit,那麼還有一位是幹嗎用的呢? 還有一位,其實就是4字節中的最高位,用來指示浮點數的正負,當最高位是1時,爲負數,最高位是0時,爲正數。it

  

舉例將17.625換算成 float型。io

  一、將17.625換算成二進制位:10001.101  ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 若是不會將小數部分轉換成二進制,請參考其餘書籍。class

  二、再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x 2的4次方(由於右移了4位)。

  此時咱們的底數M和指數E就出來了:底數部分M,由於小數點前必爲1,因此IEEE規定只記錄小數點後的就好,因此此處底數爲 0001101 。

  指數部分E,實際爲4,但須加上127,故爲131,即二進制數 10000011 符號部分S,因爲是正數,因此S爲0.

  綜上所述,17.625的 float 存儲格式就是:01000001100011010000000000000000  //這就是咱們下文中程序運行的結果


1 #include<stdio.h> 2 3 void printBin(int n) //取整數,求整數部分的二進制數 4 { 5 if(n==0) 6 return; 7 printBin(n/2); 8 printf("%d",n%2); 9 } 10 11 void printFin(float f)//求小數部分的二進制數 12 { 13 int i=0; 14 float a; 15 a=f-(int)f; 16 if(a==0) 17 { 18 printf("0"); 19 return; 20 } 21 while(a!=1) 22 { 23 i++; 24 a=a-(int)a; 25 a=a*2; 26 printf("%d",(int)a); 27 if(i>28)//爲何有這個設置呢?由於float最大存儲28位二進制小數值,實際上因爲有進位,因此小數點後的數值長度會小於28 28 return; 29 } 30 return; 31 } 32 33 void Binary(float f) 34 { 35 float a; 36 a=f; 37 printBin((int)a); 38 printf("."); //兩個二進制數之間用.進行鏈接 39 printFin(a); 40 putchar('\n'); 41 return; 42 } 43 44 45 int main(void) 46 { 47 int i; 48 union 49 { 50 float f; 51 int b; 52 }none; 53 54 float a; 55 int len=sizeof(int)*8; 56 printf("Please input F:"); 57 scanf("%f",&none.f); 58 Binary(none.f); 59 printf("%d\n",none.b); 60 for(i=0;i<len;i++) 61 { 62 printf("%4d",i); 63 } 64 putchar('\n'); 65 66 for(i=0;i<len;i++) 67 { 68 printf("%4c",('0'+((unsigned)(none.b&(1<<(none.b-1)))>>len-1)));//這個程序是移位將數據的存儲二進制形式打印出來 69 none.b<<=1; 70 } 71 putchar('\n'); 72 73 return 0; 74 }

程序運行結果以下:

1 Please input F:17.625
2 10001.101    //17.625的二進制形式
3 1099759616   //17.625的內存中的二進制存儲形式所對應的整形值
4    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31 //內存中的位數
5    0   1   0   0   0   0   0   1   1   0   0   0   1   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
相關文章
相關標籤/搜索