浮點數在記憶體中的表示

2021-06-04 22:48:54 字數 1018 閱讀 4516

c語言的float對應單精度浮點數,由1位符號、8位指數、23位尾數組成

尾數部分是二進位制小數,那23位是小數點後面的部分,小數點前面還有個隱含的1並不儲存

二進位制小數和十進位制小數道理一樣,只是基數變成2

比如十進位制的3.14 = 3x10**0 + 1x10**-1 + 4x10**-2 = 3 + 1/10 + 4/100

二進位制的的1.00011就是1x2**0 + 0x2**-1 + 0x2**-2 + 0x2**-3 + 1x2**-4 + 1x2**-5 = 1 + 1/16 + 1/32

尾數部分可以表示1.0到2.0(不包括2.0)之間的數

有些數無法用二進位制小數精確表示,就跟有些數無法用十進位制小數精確表示一樣

再說指數部分,指數部分表示2的多少次冪,儲存時加上127,也就是說2的0次冪用127(0x7f)表示

8位指數部分可以表示的最大值是127次冪,最小值是-127次冪

最後把指數部分表示的2的那麼多次冪和尾數部分相乘,就跟科學記數法乙個意思

好比3.14e-2 = 3.14 x 10**-2 = 0.0314,3.14是尾數部分,-2是指數部分

ieee格式其實就是二進位制的科學記數法,尾數部分藏了個1.,指數部分加了個127

比如1.0f內部表示為0x3f800000

0 01111111 0000000 00000000 00000000

+ 1.0 x 2**(127-127) = 1

再如1.1f內部表示為0x3f8ccccd

0 01111111 0001100 11001100 11001101

+ 1.00011001100110011001101(二進位制) x 2**(127-127)

= 2**0 + 2**-4 + 2**-5 + 2**-8 + 2**-9 + 2**-12 + 2**-13 + 2**-16 + 2**-17 + 2**-20 + 2**-21 + 2**-23

= 1 + 1/16 + 1/32 + 1/256 + 1/512 + ...

約等於1.1

浮點數在記憶體中的表示

printf f 5 printf d 5.01 輸出結果為 0.000000,乙個大數的原因。原因 int型讀成了double型 printf函式自動將float型轉化為double 就發生記憶體訪問越界,讀出非常小的數 float型讀成int型,就變成非常大的數了。2進製 10進製 對於大小為3...

浮點數在記憶體中的表示

浮點數在記憶體中的表示 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開頭的浮點數的二進位制表示 舉...