實數在內存中以規範化的浮點數存放,包括數符、階碼、尾數。數的精度取決於尾數的尾數。好比32位機上float型爲23位(由於規範化數的數碼最高位恆爲1,沒必要存儲,實際精度爲24位,下面會有詳解),double型爲52位。spa
單精度float型存儲在內存中的大小爲4個字節,即32位。內存
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx二進制
浮點表示法相似於科學計數法,任一數都可經過改變指數部分,使小數點位置發生移動,如23.45能夠寫成:2.345*10^1float
浮點表示的通常形式爲:R=M*2^e (R:Real M:Mantissa尾數 e:exponent階碼)規範化
把上面float的二進制可分紅三部分:移動
x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxdi
數符(1b) 階碼(8b) 尾數(23b)ant
double型的浮點數分別是:數符(1b)、階碼(8b)、尾數(52b)浮點數
數符sign:real的正負號 "+":0 "-":1數字
階碼e:這裏二進制實際上是移碼E(0~255)的表示,e=E-127(double型中e=E-1023) e爲正值說明這個浮點數向左移動了e位,e爲負值說明這個浮點數向右移動了e位。127=2^7-1 1023=2^10-1
尾數M:有效數字位,這裏是有效數字位的部分二進制碼,爲何說部分呢?仔細看通上下文就能夠知道了。
例1:float型浮點數125.5轉化成32位二進制浮點數
125.5的二進制碼爲1111101.1,寫成二進制的科學計數爲:1.111101*2^6(由於科學計數法「整數」部分大於1,在二進制中,「整數」部分只能恆爲1)即向左移6位,則e=6,則E=e+127=133,而E的二進制碼爲10000101,而1.111101把「整數」部分去除1以後爲111101,以後補0,共23b,造成了階碼。
因此125.5的32位二進制浮點數爲
0 10000101 11110100000000000000000
例2:float型浮點數0.5轉化成32位二進制浮點數
0.5的二進制碼爲0.1,寫成二進制的科學計數爲:1.0*2^(-1)即向右移1位,則e=-1,則E=e+127=126,而E的二進制碼爲01111110,而1.0把「整數」部分去除1以後爲0,以後補0,造成了階碼。
因此0.5的32位二進制浮點數爲
0 01111110 00000000000000000000000
double型浮點數相似。
例3:32位二進制浮點數爲0 10000010 00010000000000000000000轉化成十進制數浮點數
題中已給咱們分了三部分,數符部分、階碼部分、尾數部分。
數符部分爲0,則表明此數爲整數;階碼部分爲10000010,則E=130,則e=E-127=3,則說明其向左移了3位,0001加上「整數」部分的1以後,爲1.0001。則原二進制數爲1000.1=十進制8.5,或R=1.0001*2^3=8.5