c语言中小数在内存中的存储,c语言中小数在内存中的存储
轉至:https://blog..net/tqs_1220/article/details/73550899
首先看float和double在內存中是怎么存儲的?
float:符號位(1位)+指數位(8位)+尾數位(23位)
范圍:-2^-128 ~2^127? (-3.40E-38~3.40E+38)
double:符號位(1位)+指數位(11位)+尾數尾(52位)
范圍:-2^-1024~2^1023(-1.79E-308~1.79E+308)
在計算機中整數的存儲是大多數人能夠輕易理解得,比如在數據寬度為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语言中小数在内存中的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 32位mips运算器logisim_很多
- 下一篇: (转载)认知升级