C語言中float double等類型在內存中的存儲


問題:十進制數4.5的單精度表示和雙精度表示:

備注:   最高位符號位   0表示整數  1表示負數

            階碼:  表示的是2的多少次冪這個冪指數

            尾數:將其表示成科學計數法之后的舍去科學計數法表示的最高位為1的碼數

大致步驟是醬紫滴:

  1. 把4.5寫成二進制:整數部分4=100,小數0.5*2=1.所以4.5(10進制)=100.1(2進制);
  2. 寫成指數形式:100.1=1.001*2^2;
  3. 對於單精度來說有4個字節32位,我們通常用第32位(最高位)表示符號;用接下來的八位表示指數;用剩下的23位表示尾數;
  4. 對於上面那個數來說,符號為正,符號位為0;指數為2,這里使用移位存儲的方式,要把指數變成2+127=129,二進制是1000 0001(紅色部分);尾數位為1.001,因為表示成指數后第一位都是1,就給省了,只記錄.001即可;
  5. 綜上 4.5的單精度表示為 0100 0000 1001 0000 0000 0000 0000 0000;
  6. 寫成16進制:40 90 00 00;存儲時反向存儲即可得到結果。(小端存儲模式)
  7. 對於雙精度來說有8個字節64位,一般用最高位表示符號位;用接下來的11位表示指數;用剩下的52位表示尾數;
  8. 指數本來是2,在做移位存儲時要加上2^10-1=1023,即2+1023=1025,指數位存儲的是1025的二進制編碼1000 0000 001(紅色部分);
  9. 4.5的雙精度表示為0100 0000 0001 0010 0000 0000 0000 ……
  10. 寫成16進制:40 12 00 00 00 00 00 00;存儲的時候也要反過來存。

Ps: 移位存儲可以參看鏈接,主要思想就是要避免+0和-0的同時出現,並且能增大表示范圍。操作方法就是,如果我們想用n位來存儲帶符號的整數a,那么做移位存儲的時候就要存儲a+( 2^(n-1) - 1 ) 的相應的二進制碼;如n=8, a=2時,我們要存2+(2^7-1)=129的二進制碼.

移位存儲:http://3y.uu456.com/bp_3fcoo8iccx7z7sg756cv_1.html

可以參考下面的博文:

浮點數的二進制表示學習筆記(有很多相應的例題): http://blog.163.com/yql_bl/blog/static/847851692008112013117685/

http://blog.csdn.net/zmq5411/article/details/6301250


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM