float類型和double類型的二進制存儲

在32位環境下, float佔用32位,double佔用64位,spa

目前C/C++編譯器標準都遵守IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和  
   
  尾數來表示,底數定爲2——即把一個浮點數表示爲尾數乘以2的指數次方再添上符號。下面是具體的規格:  
   
                    符號位     階碼   尾數   長度  
  float            1              8         23       32  
  double       1            11         52       64 .net

 

下面分別舉例說明:blog

將100分別轉化爲float型和double型的二進制表達。ip

100=(1+1/2+1/16)*2^6內存

轉爲float型爲字符串

100爲正數,符號位爲0,get

階碼,一共8位,由於指數能夠爲負,爲了便於計算,規定都先加上127,在這裏6+127=133轉爲二進制爲10000101編譯器

尾數轉爲1.1001,由於最高位的1 不寫入內存,則尾數轉爲23位二進制爲10010000000000000000000string

合在一塊兒就是01000010110010000000000000000000it

 

轉爲double型爲

100爲正數,符號位爲0,

階碼,一共11位,由於指數能夠爲負,爲了便於計算,規定都先加上1023,在這裏6+1023=1029轉爲二進制爲10000000101

尾數轉爲1.1001,由於最高位的1 不寫入內存,則尾數轉爲52位二進制爲1001000000000000000000000000000000000000000000000000

合在一塊兒就是0100000001011001000000000000000000000000000000000000000000000000

 

將float轉爲二進制字符串

[cpp]  view plain  copy
 
  1. //str should have at least 33 byte.  
  2. void floattostr(float* a, char* str){  
  3.     unsigned int c;  
  4.     c= ((unsigned int*)a)[0];   
  5.     for(int i=0;i<32;i++){  
  6.         str[31-i]=(char)(c&1)+'0';  
  7.         c>>=1;  
  8.     }  
  9.     str[32] = '\0';  
  10. }  


將double轉爲二進制字符串

[cpp]  view plain  copy
 
  1. //str should have at least 64 byte.  
  2. void doubletostr(double* a, char* str){  
  3.     long long c;  
  4.     c= ((long long*)a)[0];   
  5.     for(int i=0;i<64;i++){  
  6.         str[63-i]=(char)(c&1)+'0';  
  7.         c>>=1;  
  8.     }  
  9.     str[64] = '\0';  


將32位二進制字符串轉爲float

[cpp]  view plain  copy
 
  1. float strtofloat(char * str){  
  2.     unsigned int flt = 0;  
  3.     for(int i=0;i<31;i++){  
  4.         flt += (str[i]-'0');  
  5.         flt <<= 1;  
  6.     }  
  7.     dbl += (str[31]-'0');  
  8.     float * ret = (float*)&flt;  
  9.     return *ret;  
  10. }  


將64位二進制字符串轉爲double

 

[cpp]  view plain  copy
 
    1. double strtodbl(char * str){  
    2.     long long dbl = 0;  
    3.     for(int i=0;i<63;i++){  
    4.         dbl += (str[i]-'0');  
    5.         dbl <<= 1;  
    6.     }  
    7.     dbl +=(str[63]-'0');  
    8.     double* db = (double*)&dbl;  
    9.     return *db;  
    10. }  
相關文章
相關標籤/搜索