C 小數的儲存方式

2021-07-04 00:04:37 字數 2950 閱讀 7809

在c/c++中float是32位的,double是64位的,兩者在記憶體中的儲存方式和能夠表示的精度均不同,目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。

無論是float還是double,在記憶體中的儲存主要分成三部分,分別是:

(1)符號位(sign):0代表正數,1代表負數

(2)指數字(exponent):用於儲存科學計數法中的指數部分,並且採用移位儲存方式

(3)尾數字(mantissa):用於儲存尾數部分

對於兩者在記憶體中的儲存結構,如下圖所示:

數字float 9.125在十進位制中用科學計算的方式表示為9.125*10^0  ,但是在計算機中,計算機只認識0和1,所以在計算機中是按照科學計算的二進位制的方式表示的:

9的二進位制表示為1001

0.125的二進位制表示為0.001

所以9.125的表示成1001.001  將其表示成二進位制的科學計數方式為 1.001001*2^3 

在計算機中,任何乙個數都可以表示成1.

*******2^n 這樣的形式,

其中***xx就表示尾數部分,n表示指數部分

其中,因為最高位橙色的1這裡,由於任何的乙個數表示成這種形式時這裡都是1,所以在儲存時實際上並不儲存這一位,這使得float的23bit的尾數可以表示24bit的精度,double中52bit的尾數可以表達53bit的精度。

對於float型資料,可以精確到小數點後幾位呢?當然,學過c的同學會說float能夠精確到小數點後6位,但這是怎麼的來的呢?下面做一點解釋:

十進位制中的9,在二進位制中的表示形式是1001,這裡也就告訴我們,表示十進位制中的一位數在二進位制中需要4bit,所以我們現在float中具有24bit的精度,所以float在十進位制中具有24/4=6,所以在十進位制裡,float能夠精確到小數點後6位。同理,具有53bit精度的double型別能夠精確到小數點後13位。

對於float型別,他的指數部分有8bit,可以表示-127~128,但是這裡採用了移位儲存的方式(對這個概念不太清楚),在儲存指數時資料的基數是127,而不是0,。例如上面的9.125,其二進位制的指數部分為3,所以在儲存時實際上存的是127+3=130。(130的二進位制表示為10000010)

最終根據上面圖中float的儲存結構可以知道,實際上9.125在計算機中:

上面的二進位制數轉換成十六進製制後表示形式為:01000001 00010000 00000000 00000000 --> 41 10 00 00

實際上在x86計算機中,採用的是小端儲存方式,即低位址儲存低位資料,高位址儲存高位資料。

所以資料應該是這樣儲存的:

對於double型別的儲存方式實際上和float是類似的,只是儲存的位數不同,在原理上都是一樣的。這個可以參考這篇部落格。

如有不清楚的還可以參考

浮點數轉二進位制編碼規則

354.75

354 = 101100010b

75 = 0.75 * 2 = 1.5 (取

1) = 0.5 * 2 = 1.0 = 

結果 11b

354.75 = 101100010.11 這個要一直左移到整數部分為1

1.0110001011 * 10^8(左移了8位

) + 127 = 135

127數值的由來 浮點位是

8位 取值範圍是

0~255

0-->127表示小數點向右移 

128-->255

表示向左移 

127是它的中間值 

浮點位 135

的二進位制值 

: 10000111

根據浮點編碼規則得出

0 10000111 01100010110000000000000 

正負  點位置  資料

0100 0011 1011 0001 0110 0000 0000 0000

4     3    b     1    6   0    0     0

43 b1 60 00

根據小尾讀法

00 60 b1 43

//-----下面是驗證

記憶體轉小數的道理也是一樣的

00 a8 1e 44 小尾讀法 

44 1e a8 00

44 1e a8 00

0100 0100 0001 1110 1010 1000 0000 0000

0 10001000 00111101010100000000000

正 136-127=9 1.00111101010100000000000

正 136-127=9 1001111010.101

正 136-127=9 2^9 + 2^6 + 2^5 + 2^4 + 2^3 + 2^1 + 2^-1 + 2^-3 = 512 + 64 + 32 + 16 + 8 + 2 + 0.5 + 0.125 = 634.625

//-----驗證

c中 double 

的儲存規則

63位 正負

52-63位 點位置 共11位

0-51  資料位 共52位

它的特性跟float

一樣的

小數在記憶體中的儲存方式

小數的儲存跟其他型別資料的儲存方式有很大的不同,我們通常用科學技術法來表示很大或者很小的數,即用乙個尾數 mantissa 乙個基數 base 乙個指數 exponent 以及乙個表示正負的符號來表達實數。比如123.456 用十進位制科學計數法可以表達為 1.23456 10 2 其中1.2345...

C 負數 小數如何儲存

正整數直接按照原始碼儲存,負整數按照補碼儲存。首先要清楚原碼 反碼 補碼 計算機中乙個位元組為8位,在此以乙個位元組為例 原碼 十進位制1 0000 0001 十進位制 1 1000 0001 負數的符號位為1 反碼 十進位制1 0000 00001 十進位制 1 1111 1110 除符號位外,其...

C 儲存方式

今天,莫名其妙地 奮奮 看著一本c 的時候,突然想到,是不是可以用陣列越界來 一下,c 的儲存方式呢?由於書頁上的內容太多。就簡單地寫寫吧。int main const int size 4 float a size for int i 0 i 7 i cout ta i a i endl syst...