浮點數在記憶體中是怎麼儲存的?

2021-09-13 11:16:13 字數 1297 閱讀 9967

浮點數儲存規則

根據國際標準ieee(電氣和電子工程協會)規定,任何乙個浮點數num的二進位制數可以寫為: 

num = (-1)^s*m*2^e;//(s表示符號,e表示階乘,m表示有效數字) 

①當s為0時,表示乙個正數;當s為1時,表示乙個負數 

②m表示有效數字,1<= m <2 

③2^e表示指數 

比如十進位制的3.0,二進位制就是0011.0 就可以寫成(-1)^0*1.1*2^1 

在比如十進位制的-3.0,二進位制就是-0011.0 就可以寫成(-1)^1*1.1*2^1 

而規定float型別有乙個符號位(s),有8個指數字(e),和23個有效數字位(m) 

double型別有乙個符號位(s),有11個指數字(e),和52個有效數字位(m) 

以float型別為例: 

ieee對於(有效數字)m和(指數)e有特殊的規定: (以float為例) 

1.因為m的值一定是1<= m <2,所以它絕對可以寫成1.******x的形式,所以規定m在儲存時捨去第乙個1,只儲存小數點之後的數字。這樣做節省了空間,以float型別為例,就可以儲存23位小數資訊,加上捨去的1就可以用23位來表示24個有效的資訊。 

2.對於e(指數)e是乙個無符號整數所以e的取值範圍為(0~255),但是在計數中指數是可以為負的,所以規定在存入e時,在它原本的值上加上中間數(127),在使用時減去中間數(127),這樣e的真正取值範圍就成了(-127~128)。 

對於e還分為三種情況: 

①e不全為0,不全為1: 

這時就用正常的計算規則,e的真實值就是e的字面值減去127(中間值),m的值要加上最前面的省去的1。 

②e全為0 

這時指數e等於1-127為真實值,m不在加上捨去的1,而是還原為0.******xx小數。這樣為了表示0,和一些很小的整數。 

所以在進行浮點數與0的比較時,要注意。 

③e全為1 

當m全為0時,表示±無窮大(取決於符號位);當m不全為1時,表示這數不是乙個數(nan) 

下面是測試**:

void test(void)

**輸出結果: 

具體的計算過程如下:

浮點數在記憶體中的儲存

浮點數在記憶體中的儲存方式與整型數字是不同的,對浮點數的儲存實際上是對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呢?我也很奇怪,然後就開始研究研究吧。當然這個也和編譯器有關,有些就會...