關於浮點數在記憶體當中的表示

2021-07-10 21:40:22 字數 1618 閱讀 4591

電氣和電子工程師協會(ieee)定義了幾種儲存浮點數的標準。最常用的就是單精度和雙精度。

單精度資料格式採用總共32位(4位元組)來儲存乙個浮點表示法的實數。符號占用1位,指數占用8位(採用餘127碼),尾數使用23位(無符號數)。

雙精度資料格式採用總共64位(8位元組)來儲存乙個浮點表示法的實數。符號占用1位,指數占用11位(採用餘1023碼),尾數使用52位(無符號數)。

下面以單精度為例討論浮點數的表示方法:

符號位s:占用1位,0表示正,1表示負;

指數字e:指數為占用8位,採用餘127碼系統,可表示的值為0~255,其中,0和255(即8位全部為1)是兩個特殊值,後面會詳細討論。姑且認為指數字可表示的值為1~254,對應的指數範圍是-126~127.

尾數字m:尾數字占用23位,表示小數字,範圍從0~2^23-1.

乙個實數儲存為浮點數格式的步驟是:

在s中儲存符號(0或1)

將數字轉換為二進位制

規範化找到e,m的值

連線s,e,m

例子:寫出十進位制-5.75的127餘碼表示。

符號位為1,s=1;

5.75

=101.11

=1.0111∗2

2

e=2+127=129,m=0111

因此,5.75的單精度表示方法為:

1 10000001 10110000000000000000000
類似的,對於-161.875有:

161.875=10100001.111=1.0100001111*2^7

s=1;

e=7+127=134=10000110;

m=0100001111;

//單精度表示為:

1 10000110 0100001111;

指數e=0時,有效數最高位為0,而不再是1,只有當

0<

e<28

−1時,有效數最高位為1。當指數字為0,且位數字為0時,表示+-0。指數e

=28−

1 且尾數部分為0,則表示正無窮大或者負無窮大,視符號位而定。指數e

=28−

1 且尾數部分不為0,則表示這不是乙個數。

由上面的規則可以推導出32位浮點數的表示範圍。

正最大值:se

m011111110

11111111111111111111111 n

max=

+(1−

2−24)

×2+128

正最小值:se

m000000001

00000000000000000000001 n

max=

+(1−

2−1)

×2−127

負最大值: nm

ax=−

(1−2

−24)×

2+128

負最小值: nm

ax=−

(1−2

−1)×

2−127

浮點數在記憶體中的表示

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

浮點數在記憶體中的表示

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位...