浮點數轉化二進位制

2021-08-20 17:36:50 字數 1693 閱讀 7754

乙個int型別表示的整數值是 -2^31 ~ 2^31-1

32位二進位制表示 1111111111111111

11111111

11111111

~ 011111111

11111111

11111111

1111111

類似整數聯想到浮點數是怎麼表示的呢?最初正常人可能為這樣想的

但是這樣好像表示的數也太小了,精確度也賊低。看看科學家的設計吧

依次為  符號位  階碼位  尾數字   接下來怎麼說呢?還是看個例子吧

19.2轉化為二進位制  這裡以32位為例了。64位類推  就是太長了。(整數部除2取整,小數部分乘2取整(>1的時候捨棄整數字)直到小數字為0或者超過表示範圍時候)

19.2----->    19                      .2

轉化如圖       00010011           .00110011001100110011....

編譯器正確轉化後在儲存中是怎麼表示的呢?先看下正確的答案。

0  10000011    00110011001100110011010

首先0符號位沒意見

其次是階碼位     也就是多少次方了啦 。10011.001100110011....是可以轉化為  1.0011001100110011.... *2^4 或者0.1001100110011...*2^5.    

這個4或者是5就是階碼,那階碼位也應該是  00000100 或者  00000101 啊  怎麼會是 10000011 呢?

這個就是科學家設計上的哲學了。因為模仿10進製的習慣方式,小數點的第一位必須是非0數,那麼在二進位制中非0那就只能是1了。也就是第一位必然是1,那麼編譯器就選擇了 1.001100110011...*2^4這種設計,於是呢所有的浮點數九轉化成  1.aaaaaa....*2^n這種表示方式,於是就產生了兩個問題。第乙個呢,既然所有浮點數的尾數都是1.aaaaa....這種格式,那麼計算機在儲存的時候是不是可以拿掉這個1呢,取資料的時候就加上這個1,這樣就節約了乙個寶貴的位,對不對。完美吧。還是有瑕疵的,那麼0怎麼表示呢,1.aaaa這也沒法表示0啊,於是編譯器就規定了,當尾數字1.000...階碼為-127就表示0.

即  0   11111111    0000000000000000000000  .  看上去是不是有一點點的不舒服,是的就是這串  11111111  看著好想變成 00000000 啊。那每個階碼都規定+127不就得了。 那麼0就變成了  0 00000000  000000000000000000000  perfect對不對

於是19.2 的階碼4+127就變成了  10000011   尾數1.001100110011...捨棄第乙個1 就變成了00110011001100110011010(23位)

值得注意的乙個點是尾數的後三位變成了010 為什麼不是001呢 。四捨五入四捨五入恍然大悟了吧  0011 捨棄最後乙個1需要進1 就變成了010

64位的也是這樣的就是位數不同

浮點數轉化為二進位制整型

任何資料在記憶體中都是以二進位制的形式儲存的,例如乙個short型資料1156,其二進位制表示形式為00000100 10000100。則在intel cpu架構的系統中,存放方式為 10000100 低位址單元 00000100 高位址單元 因為intel cpu的架構是小端模式。但是對於浮點數在...

浮點數的二進位制

1.前幾天,我在讀一本c語言教材,有一道例題 include void main void 在我的編譯器下 編譯是會發生錯誤的。錯誤 cannot convert from int to float win7 vc6.0 sp6 執行結果如下 num的值為 9 pfloat的值為 0.000000 ...

了解二進位制浮點數運算

所有的浮點數值計算都遵循ieee 754規範。ieee 754規定了四種表示浮點數值的方式 單精確度 32位 雙精確度 64位 延伸單精確度 43位以上,很少使用 與延伸雙精確度 79位元以上,通常以80位元實做 只有32位模式有強制要求,其他都是選擇性的。大部分程式語言都有提供ieee格式與算術,...