C语言中浮点型在计算机中的存储
一 . 浮點型的存儲
? ? ? ?在十進制中我們都學習過科學計數法,比如31.4可以用科學計數法表示就是3.14*10^1。浮點型同樣是采取科學計數法進行表示的。在計算機中,以二進制數存儲,如1011.10用科學計數法的方式可以寫成1.01110*2^3,因為浮點型還有負數,所以在計算機中表示時還需要加上一個符號位,這樣我們就可以總結出一般的浮點型數據的表示形式:(-1)^S*M*2^E。
? ? ??其中,(-1)^S是符號位。?M是尾數位,即上例中的1.01110,E是指數位,這樣我們把一個浮點型的存儲單元分成三部分。又浮點型在計算機中是4個字節,一個32個bit位,設計者把這32個bit位分為1,8,23,的形式,其中1位最高位是符號位,8位是指數位,23位是尾數位。
? ? ? (1)符號位
? ? ? ? ?最高一位符號位,?實際上就是用0正1負表示。
? ? ? ?(2)尾數位
? ? ? ? ?又我們知道任何一個二進制小數都可以寫成是1.xxx*2^E,所以M的值一個是大于1且小于2的,這樣我們就默認的省去了最前面的1,這樣M省出一個位,可以表示的范圍更大。所以M中存儲的實際是0.xxx中的xxx的部分,如上例中的1.01110*2^3,M的中存儲的實際是01110。此處還應該注意的是,在M中存儲01110的時候是靠前存儲的,即23個位表示為0111 0000 0000 0000 0000 000。為什么要這樣表示呢,這是因為如果01110靠后存儲的時候沒辦法確定有1的前面應該讀取幾個0。再舉一例,如1.000000010111*2^3的時候,M的值應該是0000 0001 0111,在23中如果靠前存儲是0000 0001 0111 0000 0000 000,這樣我們很容易讀取0000 0001 0111,并且如果后面多取0時,所表示的值的大小并不改變。而如果是靠后存儲時,則是0000 0000 0000 0000 0010 111,這樣我們就無法知道1的前面應該取幾個0。
? ? ?(3)指數位
? ? ? ? E是指數位,E的計算機中是無符號整數,它的取值范圍是0---255,但是這和我們的現實生活中又不一樣了,我們知道在實際生活中,E可以是正數也可以是負數,那么計算機如何表示這個負數呢。設計者在設計的時候,讓指數的實際值加上127之后再轉化成二進制數進行存儲,有同學不就會疑惑,這樣它的不就增大了,那它就與實際值不符啊。這里在讀取的時候又做了另一步操作,就是把E(二進制數)轉化成十進制后,再減去127這樣就還原成原來的樣子了。這樣處理之后,E的實際表示的范圍就是-127---128。補充說明,如果E為全0,則實際表示的是-127,這樣這個數很很小,幾乎接近于0,計算機就默認把它當成了0,進行表示。
二 . 浮點型的讀取
? ? 用%f去讀取一個數據時,首先將其劃分成1,8,23的形式,先讀取符號位,0正1負。接著讀取指數位E,將得到的8bit的二進制數,轉化成十進制后再減去127。最后讀取尾數位,從前讀取的值當成是小數點后面的數字,默認小數點前面有一個1,這樣就把浮點型數據讀取出來了。如1 1011 1000 0110 ?0000 0000 0000 0000 000,從前面取以為1,則表示負;接著取后八位1011 1000指數位,將其轉化成十進制數是184再將其減去127得57;再讀取后面的23個位,得011,那么它的M就是011,在前面加上默認的1,那么這個尾數就是1.011,。所以這個浮點數就是-1.011*2^57。
總結
以上是生活随笔為你收集整理的C语言中浮点型在计算机中的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中整型在计算机中的存储
- 下一篇: 幼猫几个月驱虫一次