特點
機器數有兩個基本特點:
1、數的符號數值化。實用的數據有正數和負數,由於計算機內部的硬體只能表示兩種物理狀態(用0和1表示),因此實用數據的正號“+”或負號“-”,在機器里就用一位二進制的0或1來區別。通常這個符號放在二進制數的最高位,稱符號位,以0代表符號“+”,以1代表符號“-”。因為有符號占據一位,數的形式值就不等於真正的數值,帶符號位的機器數對應的數值稱為機器數的真值。 例如二進制真值數-011011,它的機器數為 1011011。
2、二進制的位數受機器設備的限制。機器內部設備一次能表示的二進制位數叫機器的字長,一台機器的字長是固定的。字長8位叫一個位元組(Byte),機器字長一般都是位元組的整數倍,如字長8位、16位、32位、64位。
分類
根據小數點位置固定與否,機器數又可以分為
定點數和浮點數。 通常,使用定點數表示整數,而用浮點數表示實數。整理如下:
1、整數。認為整數沒有小數部分,小數點固定在數的最右邊。整數可以分為無符號整數和有符號整數兩類。無符號整數的所有二進制位全部用來表示數值的大小;有符號整數用最高位表示數的正負號,而其他位表示數值的大小。例如十進制整數-65的計算機內表示可以是11000001。
2、實數。實數的浮點數表示方法是:把一個實數的範圍和精度分別用階碼和尾數來表示。在計算機中,為了提高數據表示精度,必須表示小數點的位置,因此規定浮點數必須寫成規範化的形式,即當尾數不為0時,其絕對值大於或者等於0.5且小於1(註:因為是二進制數,要求尾數的第1位必須是1)。例如設機器字長為16位,尾數為8位,階碼為6位,則二進制實數-1101.010的機內表示為0000100111010100。
3、機器數與真值。不帶符號的數是數的絕對值,在絕對值前加上表示正負的符號就成了符號數。直接用正號“+”和負號“-”來表示其正負的二進制數叫做符號數的真值。在計算機中不僅用0,1編碼的形式表示一個數的數值部分,正、負號亦同樣用0,1編碼表示。把符號數值化以後,就能將它用於機器中。我們把一個數在機器內的表示形式稱為機器數。而這個數本身就是該機器數的真值。“01101”和“11101”是兩個機器數,而它們的真值分別為+1101和-1101。
機器數的形式
1、原碼
將數的真值形式中“+”號用“0”表示,“-”號用“1”表示時,叫做數的原碼形式,簡稱原碼。若字長為n位,原碼一般可表示為:
當X為正數時[X]原和X一樣,即[X]原 = X。當X為負數時 。由於X本身為負數,所以,實際上是將∣X∣數值部分絕對值前面的符號位上寫成“1”即可。
原碼錶示法比較直觀,它的數值部分就是該數的絕對值,而且與真值、十進制數的轉換十分方便。但是它的加減法運算較複雜。當兩數相加時,機器要首先判斷兩數的符號是否相同,如果相同則兩數相加,若符號不同,則兩數相減。在做減法前,還要判斷兩數絕對值的大小,然後用大數減去小數,最後再確定差的符號,換言之,用這樣一種直接的形式進行加運算時,負數的符號位不能與其數值部分一道參加運算,而必須利用單獨的線路確定和的符號位。要實現這些操作,電路就很複雜,這顯然是不經濟實用的。為了減少設備,解決機器內負數的符號位參加運算的問題,總是將減法運算變成加法運算,也就引進了反碼和補碼這兩種機器數。
2、反碼
如前所述,為了克服原碼運算的缺點,採用機器數的反碼和補碼錶示法。即對正數來說,其反碼和原碼的形式相同;對負數來說,反碼為其原碼的數值部分各位變反。
3、補碼
補碼是根據同餘的概念引入的,我們來看一個減法通過加法來實現的例子。假定當前時間為台北時間6點整,有一隻手錶卻是8點整,比台北時間快了2小時,校準的方法有兩種,一種是倒撥2小時,一種是正撥10小時。若規定倒撥是做減法,正撥是做加法,那么對手錶來講減2與加10是等價的,也就是說減2可以用加10來實現。這是因為8加10等於18,然而手錶最大只能指示12,當大於12時12自然丟失,18減去12就只剩6了。這說明減法在一定條件下,是可以用加法來代替的。這裡“12”稱為“模”,10稱為“-2”對模12的補數。推廣到一般則有:
A – B = A + ( – B + M ) = A + ( – B )補
可見,在模為M的條件下,A減去B,可以用A加上-B的補數來實現。這裡模(module)可視為計數器的容量,對上述手錶的例子,模為12。在計算機中其部件都有固定的位數,若位數為n,則計數值為 ,亦即計數器容量為 ,因此計算機中的補碼是以“ ”為模,其定義如下:
簡言之,對正數來說,其補碼和原碼的形式相同;而從(3)式和(4)式可以看出,對於負數,補碼為其反碼的末位加1。
總之,正數的原碼、反碼和補碼是完全相同的;負數的原碼、反碼和補碼其形式各不相同。另外,特別要注意的是,對於負數的反碼和補碼(即符號位為1的數),其符號位後邊的幾位數表示的並不是此數的數值。如果要想知道此數的大小,一定要求其反碼或補碼才行。
機器數的算術運算
1、反碼的算術運算
反碼運算要注意的問題:
(1)反碼運算時,其符號位與數值一起參加運算。
(2)反碼的符號位相加後,如果有進位出現,則要把它送回到最低位去相加(循環進位)。
(3)用反碼運算,其運算結果亦為反碼。在轉換為真值時,若符號位為0,數位不變;若符號位為1,應將結果求反才是其真值。
[例1] 已知X = + 1101 , Y = + 0110 , 用反碼計算Z = X-Y。
解: [X]反 = 01101,[-Y]反 = 11001,則[Z]反 =[X]反+[-Y]反 = 01101+11001+1(循環進位)= 00111 , 其真值為Z = +0111。
[例2] 已知X = + 0110 , Y = + 1101 , 用反碼計算Z = X-Y。
解: [X]反 = 00110,[-Y]反 = 10010,則[Z]反 =[X]反+[-Y]反 = 00110 + 10010= 11000 , 其真值為Z = - 0111。
採用反碼運算較好的解決了原碼運算所遇到的困難或問題,但由於循環進位需要二次算術相加,延長了計算時間,這同樣給電路帶來麻煩。而採用下述的補碼運算則可避免循環進位的兩次計算,同時,採用補碼運算對溢出的判斷也較採用反碼簡單的多,所以機器中的算術運算普遍採用補碼運算。
2、補碼的算術運算
補碼運算要注意的問題:
(1)補碼運算時,其符號位與數值部分一起參加運算。
(2)補碼的符號位相加後,如果有進位出現,要把這個進位捨去(自然丟失)。
(3)用補碼運算,其運算結果亦為補碼。在轉換為真值時,若符號位為0,數位不變;若符號位為1,應將結果求補才是其真值。
[例3] 已知X = + 1101 , Y = + 0110 , 用補碼計算Z = X-Y。
解: [X]補 = 01101,[-Y]補 = 11010,則[Z]補 =[X]補+[-Y]補 = 01101+11010
= 100111 , 其真值為Z = + 0111。
[例4] 已知X = + 0110 , Y = + 1101 , 用補碼計算Z = X-Y。
解: [X]補 = 00110,[-Y]補 = 10011,則[Z]補 =[X]補+[-Y]補 = 00110 + 10011
= 11001 , 其真值為Z = - 0111。
3、溢出及補碼溢出的判斷
無論採用何種機器數,只要運算的結果大於數值設備所能表示數的範圍,就會產生溢出。 溢出現象應當作一種故障來處理,因為它使結果數發生錯誤。異號兩數相加時,實際是兩數的絕對值相減,不可能產生溢出,但有可能出現正常進位;同號兩數相加時,實際上是兩數的絕對值相加,既可能產生溢出,也可能出現正常進位。
由於補碼運算存在符號位進位自然丟失而運算結果正確的問題,因此,應區分補碼的溢出與正常進位。
[例5] 某數字設備用五位二進制表示數,計算
(1)9+3 (2)-9-3 (3)9+12 (4)-9-12
解:(1)[+9]補+[+3]補= 01001+ 00011 = 01100 = +12 正確;
(2)[-9]補+[-3]補= 10111+ 11101 = 110100 = 10100(符號位進位自然丟失),其真值為-1100 = -12正確;
(3)[+9]補+[12]補= 01001 + 01100 = 10101 其真值為-1011 =-11錯誤,產生了溢出;
(4)[-9]補+[-12]補 = 10111+10100 = 101011 其真值為01011= +11 錯誤,產生了溢出。
(1)、(2)兩題結果均正確,查其最高位和次高位的進位位,不是均無進位產生,就是均產生進位;(3)、(4)兩題結果均錯誤,查其最高位和次高位的進位位,只有一位產生了進位。此即為判斷機器是正常進位還是溢出的基本依據,在微型機中可用異或電路來實現上述的判斷。
機器數的表示方法
1、定點表示法
定點,即小數點固定,固定在有效數位的最前面或最後面。因為位置是固定的,所以可以隱藏。
在最前面則表示純小數,在最後面則表示純整數,因此在定點計算機的程式語言中,純小數對應一種變數類型,純整數對應一種變數類型。
由於只能表示純小數或純整數,在編程時要設定合適的比例因子。
2、浮點表示法
N = M x rE
r是浮點數階碼的底,又叫尾數的基數,通常r=2,但可改變。
r增大,可表示數的範圍增大。
r增大,可表示數的個數增大。
r增大,可表示數的精度下降。
r增大,將使運算中移位的次數減少,運算速度提高。
E叫做階碼,純整數,常用移碼或補碼錶示。
M叫做尾數,純小數,常用原碼或補碼錶示。
E與M都是帶符號的定點數。
階碼存入階碼部件,尾數存入尾數部件,一個浮點數是由兩個不同的物理部件處理的,
機器就是這么區分哪部分是階碼,哪部分是尾數的,各部件又可進行各種操作,如階碼的相加、相減、比較操作。
浮點數的表示範圍主要由階碼的位數決定,有效數字精度主要由尾數的位數決定。
浮點數的階碼常採用移碼錶示,最主要的原因為:
(1)便於比較浮點數的大小。階碼大的,真值就大;階碼小的,真值就小。
(2)簡化機器中的判0電路。當階碼全為0,尾數也全為0時,表示0。
同一數值的移碼和補碼除最高位相反外,其它各位相同。
移碼通常取2n-1或2n為偏置值。