计算机中的数(一):数在计算机中的表示
生活随笔
收集整理的這篇文章主要介紹了
计算机中的数(一):数在计算机中的表示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考資料:
唐朔飛《計算機組成原理》高等教育出版社 張代遠《計算機組成原理教程 第二版》清華大學出版社 《另一個視角解讀計算機編碼-補碼編碼》 《補碼初探》 《為何將移碼作為浮點數的階碼》 ? 《補碼和移碼存在的意義》? 《數值數據在機內的表示》?定點和浮點 定點格式 所謂定點格式,即約定機器中所有數據的小數點位置是固定不變的。在計算機中通常采用兩種簡單的約定:約定小數點的位置固定在數據的最高位之前,稱為定點小數,或者約定小數點固定在最低位之后,稱為定點整數。定點小數是純小數,定點整數是純整數。 當數據小于定點數能表示的最小值時,計算機將它們作0處理,稱為下溢;大于定點數能表示的最大值時,計算機將無法表示,稱為上溢,上溢和下溢統稱為溢出。 當然,小數點放在哪兒,這純粹是一種約定。我們也可以約定小數點在中間的某個位,比如8位字長的機器,我們約定小數點在正中間,即我們可以將一個8位二進制數 xxxx xxxx 解讀為:xxxx.xxxx。這種方法克服了“定點小數”和“定點整數”只能表示純小數或純整數的不足,可以表示一個既含整數部分,又含小數部分的數,但這種表示形式有諸多壞處,比如當要表示的數是一個純小數且“很小”時,則這個數的大部分位都被0占據,浪費了資源,精度也不高,由此,我們引入了“浮點格式”,正如“科學計數法”所帶來的好處那樣,本來很大或很小的數都是要寫的很長很長,現在可以用不多的幾位數來表示那些很大或很小的數了,比如0.00000001可以寫成0.1×2^(-7)。 浮點格式: 在機器中的一個浮點數包括尾數和階碼兩部分,尾數用純小數形式(定點小數)表示,階碼用純整數(定點整數)形式表示。尾數部分給出有效數字的位數,因而決定了浮點數的表示精度。階碼指明小數點在數據中的位置,因而決定了浮點數的表示范圍。尾數和階碼各需要一個符號位。
在未統一約定的情況下,浮點數的表示形式不唯一。例如:11.01 也可以表示成 0.01101×2^3 或 0.1101×2^2 等等。 在兩種情況下機器將浮點數視為0,稱為機器零 1.不論階碼為何值,只要浮點數的尾數為0
2.無論尾數為何值,只要階碼的值比所能表示的最小值還要小 為了提高數據的表示精度,當尾數的值不為0時,其尾數域的最高有效位應為1,否則要進行“規格化”,即修改階碼同時移動小數點,使浮點數的形式改變,值保持不變。 IEEE754
IEEE754是目前最受認可流傳最為廣泛的浮點數標準。 該標準定義了兩種格式(雙精度和單精度)的浮點數。 該標準還定義了雙精度和單精度浮點數的擴展格式(也稱“中間格式”)。 擴展格式包括: 為階碼分配更多的位(擴展表示范圍) 為尾數分配更多的位(擴展數的精度) 擴展格式在計算過程中被使用,由于其精度和范圍被擴大了,所以能夠達到比要求精度更高的精度,然后再對這個中間結果進行取舍,得到最終結果。這樣能使計算過程中精度盡可能高。 單精度格式 長度為32位 1位符號位 | 8為階碼 | 23位尾數 雙精度格式 長度為64位 1位符號位 | 11位階碼 | 52位尾數 注意事項:拿單精度格式來說,雙精度格式以此類推 1)"符號位"表示的是數本身的正負,至于指數的正負,則在8位階碼里邊已包含了。 2)階碼用移碼表示 3)尾數用原碼表示。 4)尾數要統一規格化成1.xxxxxx的格式,既然所有的尾數都是這個格式,那么前邊的1就不用存入計算機了,只存儲后邊的xxxxx就行了。所以,雖然只給尾數分配了23位,但實際上表示的數是24位的。 看一個例子就明白了。 關于IEEE754的一個例子(2011年全國研究生入學計算機統考真題): 問題: float型數通常用IEEE754單精度浮點數格式表示,若編譯器將float型變量x分配在一個32位浮點寄存器R中,其中x=-8.25,請問R中的內容是什么? 解答: 將-8.25轉換成2進制,為-1000.01B 將該數規格化,為?-1.00001×23 回想單精度的格式:1位符號位 | 8為階碼 | 23位尾數,依次填入符號位、階碼、尾數就好了。 顯然符號位為1,表示負數。 階為“3次方”,所以階碼為“3的移碼”,先求出3的移碼 IEEE754規定,單精度數的階碼偏置值為127,所以3的移碼為127+3=130 所以階碼部分的8位應該是130這個十進制數的原碼,即1000 0010 尾數為1.00001,去掉前邊的1,就是00001, 所以尾數部分的23位就是: 0000 1000 0000 0000 0000 000 將這三部分拼接起來,得到最終R里邊存放的內容為:1100 0001 0000 0100 0000 0000 0000 0000, 寫成16進制為C1040000H 定點和浮點的對比 定點浮點各有優劣,定點運算快,但表示范圍沒有浮點大,精度沒有浮點高。 一般來說,通用的大型機大多采用浮點數,或同時采用浮點、定點數。小型、微型機、控制機等一般采用定點數,當需要進行浮點運算時,可通過軟件實現,也可以外加一個浮點協處理器來實現浮點運算。 注意,以下內容中,為了敘述方便我們約定,“機器字長為n+1位,1位表示負號,剩余n位表示數值”,凡是涉及到“取值范圍”,“如何取模”等問題,其中的n的意義皆遵從這個約定。
真值和機器碼 真值:平時手寫出來的數,5、-3之類的, 機器碼:真值在計算機里邊的格式,將符號和數值一起編碼。 機器數分為無符號數和有符號數。 無符號數:所有的位全部用來表示數本身 有符號數:機器數中的某些位用來表示數的符號,其他的位用來表示數值本身。 有符號數的整數的表示方式有四種:原碼、反碼、補碼、移碼 有符號數小數表示是尾數和階碼寫在一起,其本質上還是整數。 原碼和反碼的0都有兩種表示形式,正0和負0,所以原碼和反碼的表示范圍都是一個關于0對稱的閉區間。
原碼: 寫原碼時注意寫符號位,特別是正數,不要把符號位0給丟了 正數原碼就是化成二進制后在前邊加0 負數原碼就是化成二進制后在前邊加1 取值范圍 純小數時: 當符號位為0,數值位全為1時取到最大值:由等比數列求和公式知,最大值為2-1+2-2+…+2-n=1-2-n 當符號位為1,數值位全為1時取到最小值:同樣地,最小值為2-n-1 純整數時: 同樣有等比數列求和公式知,取值范圍為:-(2n-1)≤x≤2n-1 反碼: 本身沒啥用,就是由原碼求補碼的一種中間過渡產物。 保持原碼符號位不變,其余各位取反 取值范圍 和原碼的取值范圍完全一樣,無非原碼是符號位為0,其余位皆為1時取到最大值,而反碼是符號位為1,其余位皆為0時取到最大值。形式不同,實質完全一樣。 補碼: 定義: 正數的補碼就是它的原碼 負數的補碼是它的模減去它的絕對值,或說是它本身加上它的模 求補碼的模: 給你一個補碼形式的數,讓你求它的模,就把符號位往前進一位,這一位的值就是它的模。 想象一下,一個n+1位字長的機器,1位符號位,n位數值位,當運算結果使得符號位產生向上一位的進位時,這個進位由于硬件的限制而自然被舍掉了,那么這被舍掉的一位的值,就是模。 純小數的模為2,n位整數的模為2^(n+1) 補碼的取值范圍問題(以8位字長為例) 關于這個問題詳情參考《另一個視角解讀計算機編碼-補碼編碼》,看唐朔飛組成原理P225下邊那個表,應該更能明白所謂“在一個環上編碼”。 先討論純整數。首先將0編碼為0000 0000,然后將1編碼為0000 0001,那么為了使-1+1=0成立,就應該把-1編碼為1111 1111,而根據-2+1=-1,可知應該把-2編碼為1111 1110,想象在一個環上,由0000 0000開始,往左是減小,往右是增大,往左走盡頭是1000 0000,再減符號位就要變了,就要跨入環的另一半,進入正數的范圍內了,這個1000 0000就是補碼能夠取到的最小值,其真值為-128。 這里我們并非通過“符號位寫‘-’,剩余各位取反,末位加1”這種方法算出補碼1000 0000所對應的真值為-128的 不信我們用這種方法來做一下,1000 0000的符號位寫‘-’剩余各位為000 0000,取反之后為111 1111,加1之后變成000 0000,得到的真值是-0000000,最高位溢出了,這種算法在這里行不通。 我們之所以說補碼1000 0000對應的真值是-128,那是因為從上邊所述的“考察編碼的角度”,由“將0編碼成0000 0000”而一步步推演至全局,推演到-127時,將-127編碼為1000 0001,而繼續減小,就變成了-128,于是將-128編碼為1000 0000。這里將1000 0000與-128對應起來,只是一種編碼的方式,是一種強行規定的映射罷了,因為1000 0000是一個交界處,再往左走,就走到了0111 1111,進入了正半環了。在原碼和反碼的編碼方式中,我們把交界處編碼為0,即1000 0000和0000 0000 皆是0的編碼,在補碼中,我們覺得沒必要將0編成兩個不同的編碼,所以就把在原碼中賦予0的兩個編碼中的一個解放出來,放在負數的最左端了。然而須知這個最左端的數,并不能用“各位取反、末位加1”來算,而只能先算出它的鄰居-127,然后再推一步得到-128。 求補碼能取到的最大值是很容易的,正如原碼最大值那樣,取0111 1111就是最大值。 純小數的補碼也是一樣。最小值為1000 0000,對應-1。最大值為0111 1111。 使用補碼帶來的好處: 1.使符號位能與有效值部分一起參加運算,從而簡化運算規則 2.使減法運算轉換為加法運算,簡化計算機中運算器的線路設計 一些性質 兩個互為補數的數,它們的絕對值之和等于模。 -1不屬于小數的范圍,但在小數的補碼中,卻有-1存在。 移碼: 兩種定義方式: 一:對于某一個系列或集合的數,把它們都映射到數軸的正半軸上去,使得所有的數都不為負數,并且這種映射保持他們在數軸上的相對位置不變,即若x的真值大于y的真值,則x的移碼一定大于y的移碼。這種映射的數學表示為:[x]移=x+2n?.(這里的?[x]移=x+2n??并非硬性規定,而是一般的習慣,比如IEEE754就沒有遵循這個習慣,IEEE754在單精度情況下就取的是x+127,在雙精度情況下就取的是x+1023。要注意只有在取?[x]移=x+2n?的情況下,“移碼就是補碼的符號位取反”這一規律才成立)。 二:移碼就是將補碼的符號位取反。 移碼所帶來的好處: 1.方便比較大小 由于所有的數在經過映射之后皆不為負且相對大小不變,所以可直接將移碼當做無符號數,一眼看出兩個數誰大誰小。若是用補碼,則比較起大小就挺麻煩了。 2.使機器零為全0。 移碼的最小值為全0,而“階碼小于機器所能表達的最小值(即階碼部分為全0)”是機器零的一種。 移碼的一些性質 當移碼的各位都為0時,該移碼對應的數據是所有能夠表示的數據中的最小值。當移碼各位都是1時,是其所能表示的最大值 移碼的用途 浮點數的階碼是用移碼表示的。原因如下: 1.方便比較大小和對階。 2.用移碼來表示階碼的話可以提高表示數據的精度。 如果不采用移碼來表示階碼,那么階碼就會出現負值,當需要把該數據轉換成非階碼浮點數據時我們就需要對尾數進行左移(做乘法運算),這樣的話最先移去的是尾數的高位,而高位的丟失是嚴重影響精確度的。若用移碼表示階碼,則我們在轉換時總是做右移操作,這樣最先移去的是最低位,比較好地保持了數據的精度。 最后,四種編碼的總結: 真值和補碼的互推 由真值求補碼:原碼除符號位外,每位取反,末位加1 由補碼求真值:將符號位寫為負號“-”,其余各位按位取反,末位加1 注意,這兩種互推法,按位取反的時候都是不帶符號位的 注意:這種互推法很實用,但不適用于補碼所能表示的最小的那個數,比如四位情況下,[-8]補=1000,就不能用上述方法互推。 原碼、反碼、補碼當x為正數時,是一樣的 真正具有深刻內涵的實用價值的是補碼,所以最好清楚補碼的數學定義機器內涵,明白補碼的“模”的作用,至于原碼、反碼的數學定義形式,什么?[x]原=1-x?之類的,個人認為全是為了湊個形式完整,沒有必要做詳細了解,只要能做到給出一個x,會求出其原碼和反碼就行了。 應用場合: 原碼:IEEE754 浮點數用原碼表示尾碼 反碼:求補的過程中要先求反再加一,反碼就是這個過程的中間產物 補碼:運算時候用補碼運算 移碼:浮點數的階碼用移碼表示 取值范圍 原碼和反碼的取值范圍相同 補碼的取值范圍在原碼范圍的基礎上多往左(負方向)走了一位 移碼的范圍和補碼一樣。
轉載于:https://www.cnblogs.com/ybwang/archive/2011/10/24/2222206.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的计算机中的数(一):数在计算机中的表示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: curl 相关
- 下一篇: IIS6.0的web园--最大工作进程数