浮點數存儲方式


|--浮點數怎么存儲在計算機中

  浮點型變量是由符號位+階碼位+尾數位組成。

  float型數據 二進制為32位,符號位1位,階碼8位,尾數23位
  double型數據 二進制為64位,符號位1位,階碼11位,尾數52位

|--單精度32位存儲
  1bit 8bit 23bit

|--雙精度64位存儲
  1bit 11bit 52bit

  浮點數二進制存儲形式,是符號位+階碼位+尾數位(針對有符號數)

  浮點數沒有無符號數(c語言)

|--階碼:
  這里階碼采用移碼表示,對於float型數據其規定偏置量為127,階碼有正有負,
  對於8位二進制,則其表示范圍為-128-127,double型規定為1023,其表示范圍為-1024-1023
  比如對於float型數據,若階碼的真實值為2,則加上127后為129,其階碼表示形式為10000010

|--尾數:
  有效數字位,即部分二進制位(小數點后面的二進制位),
  因為規定M的整數部分恆為1(有效數字位從左邊不是0的第一位算起),所以這個1就不進行存儲

|--具體步驟:
  把浮點數先化為科學計數法表示形式,eg:1.1111011*2^6,然后取階碼(6)的值加上127(對於float)
  計算出階碼,尾數是處小數點后的位數(1111011),如果不夠23位,則在后面補0至23位。
  最后,符號位+階碼位+尾數位就是其內存中二進制的存儲形式

 1  eg:  2         #include <stdio.h>
 3         #include <stdlib.h>
 4         int main(int argc, char *argv[])
 5  {  6             int x = 12;
 7             char *q = (char *)&x;
 8             float a=125.5;
 9             char *p=(char *)&a;
10             
11             printf("%d\n", *q);   
12             
13             printf("%d\n",*p);  
14             printf("%d\n",*(p+1)); 
15             printf("%d\n",*(p+2)); 
16             printf("%d\n",*(p+3));  
17             return 0;
18  } 19     
20  output: 21         12
22         0
23         0
24         -5
25         66

 

|--對於float型:
  125.5二進制表示為1111101.1,由於規定尾數的整數部分恆為1,
  則表示為1.1111011*2^6,階碼為6,加上127為133,則表示為10000101
  而對於尾數將整數部分1去掉,為1111011,在其后面補0使其位數達到23位,
  則為11110110000000000000000

  內存中的表現形式為:

            00000000 低地址
            00000000
            11111011
            01000010 高地址

            存儲形式為: 00 00 fb 42
            依次打印為: 0 0 -5 66

  解釋下-5,內存中是:11111011,因為是有符號變量所以符號位為1是負數,
  所以其真值為符號位不變取反加一,變為:10000101化為十進制為-5.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM