Knowledge Point 20180305 数据在计算机中的表示
計算機發明的初衷就是用于幫助我們加工和處理數據,雖然時至今天計算機看起來無所不能,但它根本上還是在做數據的加工和處理,數據的機器層次表示將直接影響到計算機的結構和性能。
在計算機中,采用數字化方式來表示數據,數據有無符號數和帶符號數之分,其中帶符號數根據其編碼的不同又有原碼、補碼和反碼3中表示形式。下面我們來認識一下;
無符號數和帶符號數
所謂無符號數,就是整個機器字長的全部二進制位均表示數值位(沒有符號位),相當于數的絕對值,大致相當于數學中的自然數。如01000001表示無符號數65,11000001表示無符號數193。機器字長為n+1位的無符號數的表示范圍是0 ~(2^(n+1) - 1),此時二進制的最高位也是數值位,其權值等于2^n。如字長為8,那么數的表示范圍就是0~255。一般計算機中都會有一些無符號數的運算和處理指令,如條件轉移指令等。
然而,如同我們現實世界所見的大部分數據一樣,它還是需要區分正負(“+”“-”)的。在日常生活中我們使用正負和絕對值來表示數值的大小,用這種形式表示的數值在計算機技術中稱為“真值”。
對于數的符號“+”和“-”,計算機是無法識別的(實際上除了0和1,計算機什么也識別不了),因此需要把符號數碼化。通常約定二進制數的最高位為符號位,“0”表示正號,“1”表示負號。這種在計算機中使用的表示數的形式稱為機器數,常見的機器數有原碼、反碼和補碼等不同的表現形式。
區別于無符號數,帶符號數的最高位被用來表示符號,如上面的01000001表示帶符號數為正65,11000001表示帶符號數為-65。為了能正確的區別出真值和各種機器數,我們用X表示真值,[X]原表示原碼,[X]補表示補碼,[X]反表示反碼。原碼、補碼和反碼是計算機中的幾種表現形式,目的在于能夠使計算機對數據的一系列運算得出正確結果。
原碼表示法
原碼表示法是一種最簡單的機器數據表示法,其最高位是符號位,數值部分則與真值相同。
若真值是純小數,那么原碼的定義為:
[X]原 = X ??0<=X<1
[X]原 = 1-X = 1+|X| ??-1<X<=0
若真值為純整數,它的原碼定義為:
[X]原 = X ??0<=X<2^n
[X]原 = 2^n-X = 2^n + |X| ??-2^n<X<=0
因為原碼具有符號位,所以原碼中的0是有兩種表示形式的
[+0]原 = 00000
[-0]原 = 10000
原碼表示法的優點是直觀易懂,機器數和真值間的相互轉換很容易,用原碼實現乘除運算阿德規則很簡單;缺點則是實現加減運算的規則較為復雜.
補碼表示法
在介紹補碼之前,先認識一下模和同余。
模和同余
我們這里所說的模和通常所見的模數是不同的概念,這里所說的模(Module)是指一個計量器的容量,可用M表示。例如:一個4位的二進制計數器,當計數器從0開始計數到15之后,再加1,計數器的值就又會變成0。這個計數器的容量M = 2^4 = 16,即模為16。由此可見,純小數的模為2(二進制計數中對于純小數,它們的模永遠都是2,因為一旦小數位全為1后就會進位位整數位,所以小數位的周期都是2,即模數(容量)為2。),一個字長為n+1位的純整數的模為2^(n+1)。
同余概念是指兩個整數A和B除以同一個正整數M,所得余數相同,則稱A和B對M同余,即A和B在以M為模時是相等的,可寫作
A = B(mod M)
生活中最常見的同余莫過于時鐘了,對于時鐘而言,其模M = 12,故4點和16點、5點和17點、……均是同余的,它們可以寫作
4 = 16(mod 12) 5 = 17(mod 12)
利用模和同余概念的補碼表示法在進行算術運算時可以使減法運算轉化成加法運算,從而簡化機器的運算器電路。
還以時鐘為例,假如時鐘停留在8點,而現在正確的時間是6點,這時撥準時種的方法有兩種:
- l?將分針倒著撥兩圈(即倒撥兩小時)8-2=6(這是通過減法實現的)。
- l?將分針正著旋轉10周(即正撥10小時)8+10=6(mod 12)(這是通過加法實現的)
此時 ?8 - 2 = 8 + 10(mod 12)
設:A = -2 , B = 10
則:10/12 = (12-2)/12 = 1 + (-2/12)
上面-2和10也是同余。同余的兩個數具有互補的關系,-2和10對模12互補,也就是說-2的補數是10(以12位模)。
由此可見,只要確定了“模”,就可找到一個與負數等價的正數(該正數即為負數的補數)來代替此負數,而這個正數可以用模加上負數本身求得,這樣就可把減法運算轉換為加法運算實現了。而將補數概念運用到計算機中就出現了補碼這種機器數。
[X]補 = X (mod M) ??0 <= X < M/2
[X]補 = (M + X)(mod M) ????(-M/2) <= X < 0
補碼表示
補碼的符號位表示方法和原碼相同,其數值部分的表示與數的正負有關:對于正數其數值部分與真值形式相同;對于負數,將真值的數值部分按位取反,且在最低位上加1。
若真值為純小數,它的補碼表示為:
[X]補 = X (mod 2) ??0 <= X < 1
[X]補 = (2 + X)(mod 2) = (2-|X|)(mod 2) ????-1 <= X < 0
若真值是純整數,它的補碼為:
[X]補 = X ??0<=X<2^n
[X]補 = X + 2^(n+1) = 2^(n+1) - |X| ??-2^n<X<=0
在補碼表示中,0的表示形式是唯一的:
[+0]補 = [-0]補 = 00000
反碼表示法
反碼表示法與補碼表示法有許多類似之處,對于正數,數值部分與真值形式相同;對于負數,將真值的數值部分按位取反。它與補碼的區別是末位少加一個1,因而很容易從補碼的定義推出反碼的定義。
三種機器數的比較與轉換
通過上面的學習,我們知道數值在計算機中的三種表現形式,下面我們針對這三種數據進行比較學習;
比較
原碼、反碼、補碼這三種機器數既有共同點,又有各自不同的性質,主要區別有一下幾點:
- l?對于正數它們都等于真值本身,對于負數有各自的表現形式。
- l?最高位都用來表示符號位,補碼和反碼的符號位可作為數值位的一部分看待,和數值一起參與運算;但原碼的符號位不允許和數值位同等看待,必須分開處理。
- l?對于真值0,原碼和反碼各有兩種不同的表現形式,而補碼只有唯一的表現形式。
- l?原碼、反碼表示的正負數范圍相對零來說是對稱的;但補碼負數表示范圍較正數表示范圍寬,能多表示一個最負的數(絕對值最大的負數),其值等于-2^n(純整數)或-1(純小數)。
轉載于:https://www.cnblogs.com/lin-jing/p/8505668.html
總結
以上是生活随笔為你收集整理的Knowledge Point 20180305 数据在计算机中的表示的全部內容,希望文章能夠幫你解決所遇到的問題。