乙個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格式與算術,...