在計算機中整數的儲存是大多數人能夠輕易理解得,比如在資料寬度為1個位元組時,如果整數表示無符號數時就是0--15.如果整數用作有符號數時:0000--01111代表十進位制的0--7。而1000--1111表示從(-8)--(-1)。然而計算機儲存資料的方式都是一樣的,並沒有區分有符號和無符號,是我們使用資料的人來確定它到底是有符號還是無符號。而有符號資料一般使用在 資料比較、資料運算等等,其他方面差別並不是很大。
整數十分好理解,但是小數的儲存就讓人感到困難多了,很多不懂ieee規則。我們不需要懂它的規則,我們只需要記住儲存的方法,這樣以後看到小數就能輕易地知道它在記憶體中是如何儲存的了。具體分為下面幾步:
1、知道如何將十進位制的整數部分和小數部分化成二進位制。
整數就是不斷除2得到餘數,例:8的二進位制可進行這樣計算:
8/2=4餘數為0
4/2=2餘數為0
2/2=1餘數為0
1/2=0餘數為1
整數從下向上看,所以8的二進位制數就是1000。
小數對應的就是乘,例0.25的二進位制可進行這樣計算:
0.25*2=0.5整數部分為0
0.5*2=1.0 整數部分為1
當小數部分為0時結束運算,像有些資料會一直進行這種運算例如0.4永遠無法將小數部分化為0,所以就有了精度的概念。
小數從上到下看,所以0.25的二進位制數就是01。
2、知道小數的儲存是32位資料的,其中位31是符號位;位30--位23表示指數部分;位22--位0表示尾數(下面會介紹)部分。
3、不管資料的正負,先按照它的絕對值將它表示為二進位制形式,注意整數和小數部分用小數點分開。例如:8.25可表示的二進位制形式為1000.01。
4、將8.25的二進位制形式化為科學計數法形式:1.00001*2^3,其中左移指數為正,右移指數為負。
5、開始存數:
符號位 指數部分(8位) 尾數部分(23位)
0 00000000 00000000000000000000000
尾數部分:即化為科學計數法後的小數部分,如1.00001*2^3它的尾數部分就是00001,因為在化為二進位制時是從高到低看下來的,所以在尾數部分存數時就是從高到低,8.25的尾數部分就是00001000000000000000000。
指數部分:指數部分的最高位存的是左移還是右移。左移為1,右移為0。同時將指數減一放到指數部分(指數部分最高位除外),1.00001*2^3的指數部分就是10000010。
符號部分:8.25為正數,存的是0。
所以8.25在計算機中的的資料儲存就是01000001000001000000000000000000
0100 0001 0000 0100 0000 0000 0000 0000===41040000
下面講講不帶整數的小數是如何儲存資料的。
除開指數部分儲存以外,其他步驟完全一樣。我們舉例說明:0.25
0.25的二進位制形式為0.01,它化為科學計數法需要右移兩位,即1.0*2^-2。
尾數部分全0。
指數部分最高位為0(右移)。
(-2)-1=-3=fd=11111101,去除最高位,將fd低七位和指數部分最高位合在一起,即0111 1101。
0.25的32位資料即:0011 1110 1000 0000 0000 0000 0000 0000==3e800000
最後,對應負數只需修改符號位即可。同時感謝老師的講解讓我知道了它的儲存方式。
計算機中小數的儲存
我們在最初學習c語言的時候,學習資料型別的時候接觸到了浮點數,知道了它被用來儲存小數,但是為什麼在計算機中小數要稱為浮點數呢?在c語言中文網上,我知道了資料的儲存分為定點數和浮點數,它們的命名方式也取決於它們儲存資料的方式 c語言小數儲存的方法有兩種 定點數和浮點數 定點數 顧名思義,定點數就是小數...
小數在計算機中的表示
執行如下 得到結果 你猜是多少呢?嗯你沒有看錯得到的答案是57.所以為什麼會出現這種情況呢?首先需要 的是0.58這個數字是如何在計算機中儲存的。我們一般用下面格式表示浮點數。sp m 其中s是符號位,p是階碼,m是尾數。單精度浮點數是32位,雙精度浮點數是64位。s pm表示公式 偏移量1823 ...
小數儲存到計算機中為什麼會有精度損失
大家應該都知道小數轉二進位制的方法吧,乘2取整,得到積,將積的整數部分取出,再用餘下的小數部分乘2,又得到乙個積,再將積的整數部分取出,如此進行,直到積中的小數為0,或者達到所要求的精度為止。可以看到每次乘2都會取出乙個整數,將這些整數順序排列就能得到小數的二進位制表示。上面的例子乘2最終可以會停止...