C語言浮點數在記憶體中的儲存

2021-08-19 17:15:26 字數 2242 閱讀 1528

1.浮點數包括:float,double,long double

2.浮點數儲存公式:

>(-1)^s*m*2^e

>(-1)^s表示符號位,當s=0時,這個浮點數為正數,當 s=1時,浮點數為負數

>m表示有效數字,大於等於1,小於2

>2^e表示指數字

例:

十進位制5.0,寫成二進位制是101.0,相當於1.01*2^2

按照浮點數的格式,可以求出s=0,m=1.01,e=2

十進位制-5.0,寫成二進位制是-101.0,相當於1.01*2^2

按照浮點數的格式,可以求出s=1,m=1.01,e=2

3.儲存規定:

>對於32位的浮點數,最高的1位是符號位s,接著的8位是指數e,剩下的23位是有效數字m

>對於64位的浮點數,最高的1位是符號位s,接著的11位是指數e,剩下的52位是有效數字m

>對有效數字m的規定

1<=m>2,也就是說m可以寫成1.*********的形式,其中*********表示小數部分,ieee規定,在計算機儲存m時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的*********部分,比如1.01儲存的時候只儲存01,等取值的時候把第一位的1加上去。這樣做的目的是省一位有效數字。以32位浮點數為例,留給m的只有23位,將第一位加上去後,等於可以保留24位有效數字。

>對於指數e的規定:

e是乙個無符號整數,如果e為8位它的取值範圍為0~255;如果e為11位,取值範圍為:0~2047;在科學計數法中e可以出現負數,所以ieee 754規定,存入記憶體時e的真實值必須加上乙個中間數,對於8位中間數字127;對於11位中間數字1023.

2^10的e是10,所以儲存32位浮點數時,必須儲存成10+127=137,即10001001
e分3中情況:

(1).e不全為0或者不全為1

這時浮點數就採用下面的規則表示,即指數e的計算值減去127(或者1023),得到真實值,在將有效數字m前面加第一位的1。

比如:

0.5的二進位制形式為0.1,由於規定正數部分必須為1,即小數點右移1位,

則為:1.0*2^(-1),其階碼表示為:-1+127=126,表示為:01111110,

而尾數1.0去掉整數部分為0,補齊0到23位:0000 0000 0000 0000 0000 000,

則二進位制表示為:0 0111 1110 0000 0000 0000 0000 0000 000

(2).e全為0:

這時浮點數的指數e等於1-127(或者1-1023)即為真實值,有效數字m不在加上第一位的1,而是還原為0.******x的小數。這樣做是為了表示()0,以及接近0的很小數字。

(3).e全為1:

這時如果有效數字m全為0,表示正(負)無窮大(正負取決於符號位s)

4.例題:

int main()
執行結果:

為什麼會出現這樣的結果?

詳細解讀:

>為什麼第乙個*p列印結果為0?

因為n為整數。*p為浮點數,將n轉換成浮點數儲存要按照浮點數儲存的規則來:首先,寫出9的二進位制:0000 0000 0000 0000 0000 0000 0000 1001。將ox00000009拆分,得到的第一位符號位s=0,後面8位的指數e=00000000,最後的23位有效數字m=000 0000 0000 0000 0000 1001。由於指數全為0,所以指數字e=1-127.所以浮點數可以寫成:(-1)^0*0.000000000000000000001001*2^(-126)=1.001*2^(-146),顯然是乙個接近於0的正數,所以用十進位制小數表示就是0.000000.

>為什麼第二個n的列印結果為:1091567616?

首先,浮點數9.0用二進位制表示為:1001.0,即1.001*2^3。那麼第一位符號位s=0,有效數字m=001後面加20個0湊夠23位,指數e=3+127=130,即:10000010。所以寫成二進位制形式應該是s+e+m,即:0 10000010 001 0000 0000 0000 0000 0000,這個二進位制還原成十進位制為:1091567616.

浮點數在記憶體中的儲存

浮點數在記憶體中的儲存方式與整型數字是不同的,對浮點數的儲存實際上是對ieee754中規定的s m e的儲存。浮點數 float double long double 根據國際標準ieee754,任意乙個二進位制浮點數可以被表示成下面的形式 ieee754規定 對於32位的浮點數,最高的1個位元位為...

浮點數在記憶體中的儲存

浮點數在記憶體中的儲存 常見浮點數型別 float,double,long double.那麼浮點數在記憶體中又是如何儲存的呢,它會和整數一樣嗎?那它的小數點又是如何儲存的呢 int main 執行結果為 n和 pfloat在記憶體中明明是同一位置同一數字,為什麼浮點數和整數的讀取結果會不一樣.說明...

浮點數在記憶體中的儲存

整數在計算機記憶體儲存以二進位制儲存很容易理解,那浮點數怎麼儲存的呢?其實之所以想到要一 竟是因為類似下面這段 include intmain void 由於大意,用轉義字元 d來列印浮點數,結果顯示 為什麼是 461808600呢?我也很奇怪,然後就開始研究研究吧。當然這個也和編譯器有關,有些就會...