浮點數在記憶體中的表示

2021-06-09 16:27:37 字數 2381 閱讀 6486

printf("%f",5);

printf("%d",5.01);

輸出結果為:0.000000,乙個大數的原因。

原因:int型讀成了double型(printf函式自動將float型轉化為double),就發生記憶體訪問越界,讀出非常小的數;

float型讀成int型,就變成非常大的數了。

(2進製——》10進製)

對於大小為32-bit的浮點數(32-bit為單精度,64-bit浮點數為雙精度,80-bit為擴充套件精度浮點數), 

1、其第31 bit為符號位,為0則表示正數,反之為複數,其讀數值用s表示; 

2、第30~23 bit為冪數,其讀數值用e表示; 

3、第22~0 bit共23 bit作為係數,視為二進位制純小數,假定該小數的十進位制值為x; 

則按照規定,該浮點數的值用十進位制表示為: 

= (-1)^s   * (1 + x) * 2^(e - 127) 

(-1)^a*(1+c)*2^(b-127)

對於49e48e68來說, 

1、其第31 bit為0,即s = 0 

2、第30~23 bit依次為100 1001 1,讀成十進位制就是147,即e = 147。 

3、第22~0 bit依次為110 0100 1000 1110 0110 1000,也就是二進位制的純小數0.110 0100 1000 1110 0110 1000,其十進位制形式為0.78559589385986328125,即x = 0.78559589385986328125。 

這樣,該浮點數的十進位制表示 

= (-1)^s   * (1 + x) * 2^(e - 127) 

= (-1)^0   * (1+ 0.78559589385986328125) * 2^(147-127) 

= 1872333

(10進製——》2進製)

(出自實數在記憶體中以規範化的浮點數存放,包括數符、階碼、尾數。數的精度取決於尾數的尾數。比如32位機上float型為23位(因為規範化數的數碼最高位恒為1,不必儲存,實際精度為24位,下面會有詳解),double型為52位。

單精度float型儲存在記憶體中的大小為4個位元組,即32位。

******xx ******xx ******xx ******xx

浮點表示法類似於科學計數法,任一數均可通過改變指數部分,使小數點位置發生移動,如23.45可以寫成:2.345*10^1

浮點表示的一般形式為:r=m*2^e (r:real m:mantissa尾數 e:exponent階碼)

把上面float的二進位制可分成三部分: x 

******xx 

*********************xx

數符(1b) 

階碼(8b) 

尾數(23b)

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

浮點數在記憶體中的表示

c語言的float對應單精度浮點數,由1位符號 8位指數 23位尾數組成 尾數部分是二進位制小數,那23位是小數點後面的部分,小數點前面還有個隱含的1並不儲存 二進位制小數和十進位制小數道理一樣,只是基數變成2 比如十進位制的3.14 3x10 0 1x10 1 4x10 2 3 1 10 4 10...

浮點數在記憶體中的表示

浮點數在記憶體中的表示 c語言 浮點數在記憶體中的表示 單精度浮點數 1位符號位 8位階碼位 23位尾數 雙精度浮點數 1位符號位 11位階碼位 52位尾數 實數在記憶體中以規範化的浮點數存放,包括數符 階碼 尾數。數的精度取決於尾數的位數。比如32位機上float型為23位 double型為52位...

浮點數在記憶體中的表示 例項

value 1 sign significand 2 exponet sign 浮點數在記憶體中的表示符號的那位數的位數 significand 浮點數的有效數的二進位制形式 exponet 浮點數的指數 2的冪 float 8位double 11位 規格化 隱含的以1開頭的浮點數的二進位制表示 舉...