C語言中 float double在內存中的存儲

  C語言中,對於浮點類型的數據採用單精度類型(float)和雙精度類型(double)來存儲,float數據佔用32bit, double數據佔用

64bit,我們在聲明一個變量float f= 2.25f的時候,是如何分配內存的呢?如果胡亂分配,那世界豈不是亂套了麼,其實不論是

float還是double在存儲方式上都是遵從IEEE的規範的,float遵從的是IEEE R32.24 ,而double 遵從的是R64.53。

無論是單精度還是雙精度在存儲中都分爲三個部分:

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

2.                   指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲

3.                   尾數部分(Mantissa):尾數部分

其中float的存儲方式如下圖所示:


而雙精度的存儲方式爲:



 R32.24和R64.53的存儲方式都是用科學計數法來存儲數據的,比如8.25用十進制的科學計數法表示就爲:8.25*10^0 ,而120.5

可以表示爲:1.205*10^2 , 這些小學的知識就不用多說了吧。而我們傻蛋計算機根本不認識十進制的數據,他只認識0,1,所以

在計算機存儲中,首先要將上面的數更改爲二進制的科學計數法表示,8.25用二進制表示可表示爲1000.01,我靠,不會連這都

不會轉換吧?那我估計要沒轍了。120.5用二進制表示爲:1110110.1用二進制的科學計數法表示1000.01可以表示爲1.0001*2^3 ,

1110110.1可以表示爲1.1101101*2^6 ,任何一個數都的科學計數法表示都爲1.xxx* 2^n, 尾數部分就可以表示爲xxxx,第一位都是1嘛,

幹嘛還要表示呀?可以將小數點前面的1省略,所以23bit的尾數部分,可以表示的精度卻變成了 24bit,而對於指數部分,因爲指數

可正可負,8位的指數位能表示的指數範圍就應該爲:-127-128了,所以指數部分的存儲採用移位存儲,存儲的數據爲元數據+127,

下面就看看8.5和120.5在內存中真正的存儲方式。

 首先看下8.5,用二進制的科學計數法表示爲:1.0001*2^3

按照上面的存儲方式,符號位爲:0,表示爲正,指數位爲:3+127=130 ,位數部分爲,故8.5的存儲方式如下圖所示:


而單精度浮點數120.5的存儲方式如下圖所示:


下面說下取值範圍和精度:
取值範圍看指數部分:
float是有符號型,其中,8位指數位,2^8=(-128—127),因此實際的範圍是-2^128—2^127,約爲-3.4E38—3.4E38
同理double範圍約是-1.7E308—1.7E308,
精度是看尾數部分:
float尾數位23位,2^23=8.3E6,7位,所以不同的編譯器規定不同,有些是7位,有些8位
double尾數52位,2^52=4.5E15,15位,所以double的有效位數是15位


轉載於:

http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgXnSlpof5pKKJbjScy1StbVdiUWARuAYUIYiyHeTIIhVaz3

發佈了15 篇原創文章 · 獲贊 73 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章