float類型和double類型的二進制存儲
在32位環境下, float占用32位,double占用64位,
目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和
尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64
下面分別舉例說明:
將100分別轉化為float型和double型的二進制表達。
100=(1+1/2+1/16)*2^6
轉為float型為
100為正數,符號位為0,
階碼,一共8位,因為指數可以為負,為了便於計算,規定都先加上127,在這裏6+127=133轉為二進制為10000101
尾數轉為1.1001,因為最高位的1 不寫入內存,則尾數轉為23位二進制為10010000000000000000000
合在一起就是01000010110010000000000000000000
轉為double型為
100為正數,符號位為0,
階碼,一共11位,因為指數可以為負,為了便於計算,規定都先加上1023,在這裏6+1023=1029轉為二進制為10000000101
尾數轉為1.1001,因為最高位的1 不寫入內存,則尾數轉為52位二進制為1001000000000000000000000000000000000000000000000000
合在一起就是0100000001011001000000000000000000000000000000000000000000000000
將float轉為二進制字符串
[cpp] view plain copy- //str should have at least 33 byte.
- void floattostr(float* a, char* str){
- unsigned int c;
- c= ((unsigned int*)a)[0];
- for(int i=0;i<32;i++){
- str[31-i]=(char)(c&1)+‘0‘;
- c>>=1;
- }
- str[32] = ‘\0‘;
- }
將double轉為二進制字符串
- //str should have at least 64 byte.
- void doubletostr(double* a, char* str){
- long long c;
- c= ((long long*)a)[0];
- for(int i=0;i<64;i++){
- str[63-i]=(char)(c&1)+‘0‘;
- c>>=1;
- }
- str[64] = ‘\0‘;
將32位二進制字符串轉為float
- float strtofloat(char * str){
- unsigned int flt = 0;
- for(int i=0;i<31;i++){
- flt += (str[i]-‘0‘);
- flt <<= 1;
- }
- dbl += (str[31]-‘0‘);
- float * ret = (float*)&flt;
- return *ret;
- }
將64位二進制字符串轉為double
[cpp] view plain copy
- double strtodbl(char * str){
- long long dbl = 0;
- for(int i=0;i<63;i++){
- dbl += (str[i]-‘0‘);
- dbl <<= 1;
- }
- dbl +=(str[63]-‘0‘);
- double* db = (double*)&dbl;
- return *db;
- }
float類型和double類型的二進制存儲