C/C++中float和double的存儲結構


在C/C++中float是32位的,double是64位的,兩者在內存中的存儲方式和能夠表示的精度均不同,目前C/C++編譯器標准都遵照IEEE制定的浮點數表示法來進行float,double運算。

無論是float還是double,在內存中的存儲主要分成三部分,分別是:

(1)符號位(Sign):0代表正數,1代表負數

(2)指數位(Exponent):用於存儲科學計數法中的指數部分,並且采用移位存儲方式

(3)尾數位(Mantissa):用於存儲尾數部分

 

對於兩者在內存中的存儲結構,如下圖所示:

 

    數字float 9.125在十進制中用科學計算的方式表示為9.125*10^0  ,但是在計算機中,計算機只認識0和1,所以在計算機中是按照科學計算的二進制的方式表示的:

9的二進制表示為1001

0.125的二進制表示為0.001

所以9.125的表示成1001.001  將其表示成二進制的科學計數方式為 1.001001*2^3 

 

在計算機中,任何一個數都可以表示成1.xxxxxx*2^n 這樣的形式,

其中xxxxx就表示尾數部分,n表示指數部分

其中,因為最高位橙色的1這里,由於任何的一個數表示成這種形式時這里都是1,所以在存儲時實際上並不保存這一位,這使得float的23bit的尾數可以表示24bit的精度,double中52bit的尾數可以表達53bit的精度。

 

    對於float型數據,可以精確到小數點后幾位呢?當然,學過c的同學會說float能夠精確到小數點后6位,但這是怎么的來的呢?下面做一點解釋:

    十進制中的9,在二進制中的表示形式是1001,這里也就告訴我們,表示十進制中的一位數在二進制中需要4bit,所以我們現在float中具有24bit的精度,所以float在十進制中具有24/4=6,所以在十進制里,float能夠精確到小數點后6位。同理,具有53bit精度的double類型能夠精確到小數點后13位。

    對於float類型,他的指數部分有8bit,可以表示-127~128,但是這里采用了移位存儲的方式(對這個概念不太清楚),在存儲指數時數據的基數是127,而不是0,。例如上面的9.125,其二進制的指數部分為3,所以在存儲時實際上存的是127+3=130。(130的二進制表示為10000010)

最終根據上面圖中float的存儲結構可以知道,實際上9.125在計算機中:

上面的二進制數轉換成十六進制后表示形式為:01000001 00010000 00000000 00000000 --> 41 10 00 00

實際上在X86計算機中,采用的是小端存儲方式,即低地址存儲低位數據,高地址存儲高位數據。

所以數據應該是這樣存儲的:

對於double類型的存儲方式實際上和float是類似的,只是存儲的位數不同,在原理上都是一樣的。

 

http://blog.csdn.net/qingtingchen1987/article/details/7719259


免責聲明!

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



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