- STC 32位 8051單片機原理與應用
- 丁向榮編著
- 1814字
- 2023-12-13 15:45:02
1.1.2 微型計算機中數的表示方法
1.機器數與真值
數學中數的正和負用符號“+”和“-”表示,計算機中如何表示數的正和負呢?在計算機中,數據是存放在存儲單元內的。每個存儲單元是由若干二進制位組成的,其中每一數位或是0或是l,而數的符號或為“+”或為“-”,因此,可用一個數位來表示數的符號。在計算機中,規定用“0”表示“+”、用“1”表示“-”。用來表示數的符號的數位被稱為“符號位”(通常為最高數位),于是數的符號在計算機中就被數碼化了,但從表示形式上看,符號位與數值位沒有區別。
設有兩個數x1,x2:
x1=+1011011B,x2=-1011011B
它們在計算機中分別表示為
x1=01011011B,x2=11011011B
其中,帶下畫線部分為符號位,字長為8位。為了區分這兩種形式的數,我們把機器中以數碼形式表示的數稱為機器數(x1=01011011B及x2=11011011B),把原來以一般書寫形式表示的數稱為真值(x1=+1011011B及x2=-1011011B)。
若一個數的所有數位均為數值位,則該數為無符號數;若一個數的最高數位為符號位,其他數位為數值位,則該數為有符號數。由此可見,同一個存儲單元中存放的無符號數和有符號數所能表示的數值范圍是不同的(例如,存儲單元為8位,當它存放無符號數時,因有效的數值位為8位,該數的范圍為0~255;當它存放有符號數時,因有效的數值位為7位,該數的范圍為-128~+127)。
2.原碼
對于一個二進制數,如果用最高數位表示該數的符號(0表示“+”,l表示“-”),其余各數位表示數值本身,則稱這種表示方法為原碼表示法。
若x=±x1x2…xn-1,則[x]原=±x0x1x2…xn-1。其中,x0為原機器數的符號位,它滿足:

3.反碼
如果[x]原=0x1x2…xn-1,則[x]反=[x]原。
如果[x]原=1x1x2…xn-1,則。
也就是說,正數的反碼與其原碼相同,而負數的反碼是保持原碼的符號位不變,各數值位按位取反。
4.補碼
1)補碼的引進
首先以日常生活中經常遇到的鐘表對時為例來說明補碼的概念,假定現在是北京時間8點整,而一只表卻指向10點整。為了校正此表,可以采用倒撥和順撥兩種方法:倒撥就是逆時針減少2小時,把倒撥視為減法,相當于10-2=8,時針指向8;順撥就是將時針順時針撥10小時,時針同樣指向8,把順撥視為加法,相當于10+10=12(自動丟失)+8=8,其中自動丟失的數(12)就稱為模(mod),上述加法稱為“按模12的加法”,用數學式可表示為
10+10=12+8=8(mod12)
因時針轉一圈會自動丟失一個數12,故10-2與10+10是等價的,稱10和-2對模12互補,10是-2對模12的補碼。引進補碼概念后,就可以將原來的減法10-2=8轉化為加法10+10=12(自動丟失)+8=8(mod12)了。
2)補碼的定義
通過上面的例子不難理解計算機中負數的補碼表示法。設寄存器(或存儲單元)的位數為n,則它能表示的無符號數最大值為2n-l,逢2n進1(2n自動丟失)。換句話說,在字長為n的計算機中,數2n和0的表示形式一樣。若機器中的數以補碼表示,則數的補碼以2n為模,即
[x]補=2n+x(mod2n)
若x為正數,則[x]補=x;若x為負數,則[x]補=2n+x=2n-|x|,即負數x的補碼等于2n(模)加上其真值或減去其真值的絕對值。
在補碼表示法中,0只有一種表示形式,即0000…0。
3)求補碼的方法
根據上述介紹可知,正數的補碼等于原碼。下面介紹求負數補碼的3種方法。
(1)根據真值求補碼。
根據真值求補碼就是根據定義求補碼,即
[x]補=2n+x=2n-|x|
負數的補碼等于2n(模)加上其真值,或者等于2n(模)減去其真值的絕對值。
(2)根據反碼求補碼(推薦使用方法)。
[x]補=[x]反+1
(3)根據原碼求補碼。
負數的補碼等于其反碼加l,這也可以理解為負數的補碼等于其原碼各位(除符號位外)取反并在最低位加1。如果反碼的最低位是1,則它加1后就變成0,并產生向次低位的進位。如果反碼的次低位也為l,則它同樣變成0,并產生向其高位的進位(這相當于在傳遞進位)。以此類推,進位一直傳遞到第1個為0的位為止,于是得到這樣的轉換規律:從反碼的最低位起直到第一個為0的位之前(包括第一個為0的位),一定是1變0,第一個為0的位以后的位都保持不變。由于反碼是由原碼求得的,所以可得從原碼求補碼的規律為:從原碼的最低位開始到第1個為1的位之間(包括此位)的各位均不變,此后各位取反,但符號位保持不變。
特別要指出的是,在計算機中凡是帶符號的數一律用補碼表示且符號位參加運算,其運算結果也用補碼表示,若結果的符號位為“0”,則表示結果為正數,此時可以認為該結果是以原碼形式表示的(正數的補碼即原碼);若結果的符號位為“l”,則表示結果為負數,此時可以認為該結果是以補碼形式表示的,若用原碼來表示該結果,還需要對結果求補(除符號位外“取反加l”),即
[[x]補]補=[x]原