在C/C++中float是32位的,double是64位的,二者在內存中的存儲方式和可以表示的精度均不一樣,目前C/C++編譯器標準都遵守IEEE制定的浮點數表示法來進行float,double運算。html
不管是float仍是double,在內存中的存儲主要分紅三部分,分別是:.net
(1)符號位(Sign):0表明正數,1表明負數htm
(2)指數位(Exponent):用於存儲科學計數法中的指數部分,而且採用移位存儲方式blog
(3)尾數位(Mantissa):用於存儲尾數部分內存
對於二者在內存中的存儲結構,以下圖所示:get
數字float 9.125在十進制中用科學計算的方式表示爲9.125*10^0 ,可是在計算機中,計算機只認識0和1,因此在計算機中是按照科學計算的二進制的方式表示的:編譯器
9的二進制表示爲1001it
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