官术网_书友最值得收藏!

2.1 計(jì)算機(jī)中的數(shù)、編碼和運(yùn)算

2.1.1 計(jì)算機(jī)中常用的數(shù)制及相互轉(zhuǎn)換

計(jì)算機(jī)要能計(jì)算,首先必須解決數(shù)和其他信息的表達(dá)問題。

1.計(jì)算機(jī)中常用的數(shù)制

數(shù)制是人們利用符號(hào)來記數(shù)的科學(xué)方法。數(shù)制可以有很多種,但在計(jì)算機(jī)的設(shè)計(jì)與使用上,常用的有十進(jìn)制、二進(jìn)制、八進(jìn)制和十六進(jìn)制。

存在決定意識(shí)。擁有十個(gè)手指這個(gè)客觀存在,使得人類在遠(yuǎn)古時(shí)代就想到了采用十進(jìn)制數(shù)來記數(shù)。計(jì)算機(jī)要能計(jì)算,首先必須解決記數(shù)問題。如果用物理器件的一個(gè)狀態(tài)來表示和存儲(chǔ)一個(gè)數(shù)的話,顯然基數(shù)越多系統(tǒng)越復(fù)雜,而基數(shù)最少的二進(jìn)制只有“0”和“1”兩個(gè)基數(shù),因而可以方便地用二值電路來表達(dá)。用電路來組成計(jì)算機(jī),有運(yùn)算迅速、電路簡(jiǎn)便、成本低廉等優(yōu)點(diǎn),這也正是在計(jì)算機(jī)中為什么要使用二進(jìn)制的根本原因。

雖然二進(jìn)制數(shù)便于機(jī)器表達(dá),但其過于冗長(zhǎng)的缺點(diǎn)卻給人們的書寫、閱讀及記憶帶來了不便,于是十六進(jìn)制數(shù)便應(yīng)運(yùn)而生。八進(jìn)制數(shù)的引入也是基于這個(gè)原理。

2.不同數(shù)制間的轉(zhuǎn)換

由于人們習(xí)慣用十進(jìn)制記數(shù),在研究問題或討論解題的過程時(shí),總是用十進(jìn)制數(shù)來考慮和書寫。考慮成熟后,要把問題變成計(jì)算機(jī)能夠“看得懂”的形式時(shí),就得把問題中的所有十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制代碼。這就需要用到“十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)的方法”。在計(jì)算機(jī)運(yùn)算完畢得到二進(jìn)制數(shù)的結(jié)果時(shí),又需要用到“二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的方法”,才能把運(yùn)算結(jié)果用十進(jìn)制形式顯示出來。3種常用數(shù)制間的轉(zhuǎn)換方法可總結(jié)為如圖2-1所示。

圖2-1 3種常用數(shù)制間的轉(zhuǎn)換方法

2.1.2 微型計(jì)算機(jī)中常用的編碼

由于微型機(jī)不但要處理數(shù)值計(jì)算問題,還要處理大量非數(shù)值計(jì)算問題,因此,不論是十進(jìn)制數(shù)還是英文字母、漢字及某些專用符號(hào)等,都必須變換成二進(jìn)制代碼。這樣,它們才能被計(jì)算機(jī)識(shí)別、接收、存儲(chǔ)、傳送和處理。

微型計(jì)算機(jī)中常用的編碼有十進(jìn)制數(shù)的編碼和非數(shù)值數(shù)據(jù)的編碼兩大類。常用的十進(jìn)制數(shù)的編碼有BCD碼、余3碼和格雷碼;常用的非數(shù)值數(shù)據(jù)的編碼有ASCII碼和漢字編碼。下面重點(diǎn)介紹BCD碼和ASCII碼。

1.BCD碼(十進(jìn)制數(shù)的二進(jìn)制編碼)

在微型機(jī)中,十進(jìn)制數(shù)除了轉(zhuǎn)換成二進(jìn)制數(shù)進(jìn)行處理外,還可用二進(jìn)制數(shù)對(duì)其進(jìn)行編碼(通常用4 位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù)),使它既具有二進(jìn)制數(shù)的形式又具有十進(jìn)制數(shù)的特點(diǎn)。二-十進(jìn)制碼又稱為BCD碼(Binary Coded Decimal)。由于4位二進(jìn)制數(shù)能編出16個(gè)碼,其中有6個(gè)是多余的,應(yīng)該放棄不用。而這種多余性便產(chǎn)生了多種不同的BCD碼,其中最常用的是842l碼。8421 碼與十進(jìn)制數(shù)的對(duì)照關(guān)系見表2-1。從表中可以看出,在8421BCD碼中決不允許出現(xiàn)1010~1111這6個(gè)代碼(它們被稱為禁用碼)。10以上的十進(jìn)制數(shù)至少需要兩位BCD碼(即8位二進(jìn)制數(shù))來表示,而且不應(yīng)該出現(xiàn)禁用碼,否則就不是BCD碼。因此BCD數(shù)是由BCD碼構(gòu)成的,是以二進(jìn)制形式出現(xiàn)的,但它不是真正的二進(jìn)制數(shù)。例如,十進(jìn)制數(shù)25的BCD碼形式為00100101B(即25H),而它等值的二進(jìn)制數(shù)為00011001B(即19H)。

表2-1 8421BCD碼編碼表

2.ASCII碼

由于微型機(jī)需要進(jìn)行非數(shù)值處理(如指令、數(shù)據(jù)的輸入、文字的輸入及處理等),必須對(duì)字母、文字及某些專用符號(hào)進(jìn)行編碼。微型機(jī)系統(tǒng)的字符編碼多采用美國(guó)信息交換標(biāo)準(zhǔn)代碼,即ASCII碼(American Standard Code for Information Interchange)。

ASCII碼是7位代碼,共可為128個(gè)字符編碼,如附錄A所示。包括96個(gè)圖形字符和32個(gè)控制字符。在8位微型計(jì)算機(jī)中,信息通常是按字節(jié)存儲(chǔ)和傳送的,一個(gè)字節(jié)有8位,而ASCII碼共有7位,作為一個(gè)字節(jié)還多出一位,多出的位為最高位,常用做奇偶校驗(yàn),故稱為奇偶校驗(yàn)位。奇偶校驗(yàn)位在信息傳送時(shí)用途很大,可用來檢驗(yàn)信息在傳輸過程中是否出錯(cuò),常用于微型計(jì)算機(jī)通信中。

請(qǐng)讀者注意,0~9的數(shù)字字符其相應(yīng)的ASCII碼為30H~39H,大寫英文字母A~F其相應(yīng)的ASCII碼為41H~46H,這些符號(hào)的ASCII碼在數(shù)碼轉(zhuǎn)換中經(jīng)常要用到。

2.1.3 微型計(jì)算機(jī)的運(yùn)算基礎(chǔ)

1.帶符號(hào)數(shù)的表示法

計(jì)算機(jī)中處理的數(shù)值數(shù)據(jù)可分為無符號(hào)數(shù)和有符號(hào)數(shù)兩類。

(1)機(jī)器數(shù)與真值

數(shù)學(xué)中的正負(fù)用符號(hào)“+”和“-”表示。而在計(jì)算機(jī)中,數(shù)字存放在由存儲(chǔ)元件構(gòu)成的寄存器或存儲(chǔ)器中,二進(jìn)制的數(shù)字符號(hào)1和0是用電路的兩種不同穩(wěn)定狀態(tài)(如高、低電位)來表示的。數(shù)的符號(hào)“+”或“-”也要用這兩種狀態(tài)來區(qū)別。例如,正數(shù)的符號(hào)用“0”表示,負(fù)數(shù)的符號(hào)用“1”表示。用來表示數(shù)的符號(hào)的數(shù)位被稱為“符號(hào)位”(通常為最高數(shù)位),這樣就使數(shù)的符號(hào)也“數(shù)碼化”了,即從表達(dá)形式上看符號(hào)位與數(shù)值位毫無區(qū)別。這種符號(hào)數(shù)碼化的數(shù)被稱為機(jī)器數(shù),而把原來的帶正負(fù)號(hào)的數(shù)稱為相應(yīng)機(jī)器數(shù)的真值。

機(jī)器數(shù)是計(jì)算機(jī)中數(shù)的基本形式,為了運(yùn)算方便,機(jī)器數(shù)通常有原碼、反碼和補(bǔ)碼3種形式。關(guān)于原碼和反碼的定義及求取方法在先修課程中已有詳盡介紹,在此不再贅述。下面重點(diǎn)介紹補(bǔ)碼的定義及運(yùn)算。

(2)補(bǔ)碼的概念及定義

首先以日常生活中經(jīng)常遇到的鐘表為例來說明補(bǔ)碼的概念。假定現(xiàn)在是北京標(biāo)準(zhǔn)時(shí)間2時(shí)整,而一只表卻指向3時(shí)整。為了校正此表,可以采用倒拔和順拔兩種方法。倒拔就是反時(shí)針減少1小時(shí)(把倒拔視為減法,相當(dāng)于3-1 = 2),時(shí)針指向2。還可將時(shí)針順拔11時(shí),時(shí)鐘同樣也指向2。把順拔視為加法,相當(dāng)于3 + 11 = 12(自動(dòng)丟失)+ 2 = 2。這個(gè)自動(dòng)丟失的數(shù)(12)就稱為模(mod),即一個(gè)系統(tǒng)的量程或此系統(tǒng)所能表示的最大數(shù)。上述的加法就稱為“按模12的加法”,用數(shù)學(xué)式可表示為

3 + 11 = 2(mod 12)

因時(shí)針轉(zhuǎn)一圈會(huì)自動(dòng)丟失一個(gè)數(shù)12,故3-2與3 + 11是等價(jià)的。稱11和-1對(duì)模12互補(bǔ),11是-1對(duì)模12的補(bǔ)碼。引進(jìn)補(bǔ)碼的概念后,就可將原來的減法3-1 = 2轉(zhuǎn)化為加法3 + 11 = 2(mod 12),這正是引入補(bǔ)碼的主要意義。

可以分別從模和反碼這兩個(gè)概念引出補(bǔ)碼的具體定義,下面分別闡述之。

① 以模的概念定義補(bǔ)碼

通過上面的例子不難理解計(jì)算機(jī)中負(fù)數(shù)的補(bǔ)碼表示法。設(shè)寄存器(或存儲(chǔ)單元)的位數(shù)為n位,則它能表示的無符號(hào)數(shù)的最大值為2n-1,逢2n進(jìn)一(即2n自動(dòng)丟失)。換言之,在字長(zhǎng)為n的計(jì)算機(jī)中,數(shù)2n和0的表示形式一樣。若機(jī)器中的數(shù)以補(bǔ)碼表示,則數(shù)的補(bǔ)碼以2n為模。即

由式(2-1)可知:

X為正數(shù),則[X]補(bǔ) = X,即正數(shù)的補(bǔ)碼是它本身。

X為負(fù)數(shù),則[X]補(bǔ) = 2n + X = 2n-|X|,即負(fù)數(shù)的補(bǔ)碼等于2n(模)加上其真值,或者等于2n(模)減去其真值的絕對(duì)值。

② 利用反碼定義補(bǔ)碼

(3)補(bǔ)碼的求取方法

根據(jù)前述介紹可知,正數(shù)的補(bǔ)碼等于原碼。下面介紹負(fù)數(shù)求補(bǔ)碼的3種方法。

① 利用模求補(bǔ)碼

按式(2-1)有:[X]補(bǔ) = 2n + X = 2n-|X|

即負(fù)數(shù)的補(bǔ)碼等于2n(模)加上其真值,或者等于2n(模)減去其真值的絕對(duì)值。

【例2-1】 已知X =-1001011B,試求[X]補(bǔ)

:根據(jù)式(2-1)可知

[X]補(bǔ) = 2n + X = 28-1001011B = 10110101B

② 利用十六進(jìn)制數(shù)形式求取補(bǔ)碼的便捷方法

二進(jìn)制數(shù)常常以十六進(jìn)制數(shù)的形式來表示,對(duì)于十六進(jìn)制數(shù)的補(bǔ)碼依然可以用式(2-1)來定義和計(jì)算。

以8位微型機(jī)中常用的單字節(jié)數(shù)為例,此時(shí),n = 8,模2n=28=100H,式(2-1)可改造為

如果X≥0,則[X]補(bǔ) = X

如果X < 0,則[X]補(bǔ) = 100H -|X|

這種求補(bǔ)碼的方法在分析數(shù)據(jù)時(shí)便于手工計(jì)算。例如,X =-2,則 X 的補(bǔ)碼用單字節(jié)十六進(jìn)制數(shù)表達(dá),就是[X]補(bǔ) = 100H-02H = FEH。

③ 根據(jù)反碼求補(bǔ)碼

首先求真值對(duì)應(yīng)的原碼,再求相應(yīng)的反碼,最后根據(jù)式(2-2)得到原數(shù)對(duì)應(yīng)的二進(jìn)制形式的補(bǔ)碼。這種利用取反加1求負(fù)數(shù)補(bǔ)碼的方法,便于在邏輯電路中利用非門電路和加法計(jì)數(shù)器的功能實(shí)現(xiàn)。

(4)由補(bǔ)碼求取真值的方法

需要特別指出的是,在計(jì)算機(jī)中凡是帶符號(hào)的數(shù)一律用補(bǔ)碼表示,且符號(hào)位參加運(yùn)算,其運(yùn)算結(jié)果也用補(bǔ)碼表示。若結(jié)果的符號(hào)位為“0”,則表示結(jié)果為正數(shù),此時(shí)可以認(rèn)為它是以原碼形式表示的(正數(shù)的補(bǔ)碼即為原碼);若結(jié)果的符號(hào)位為“l(fā)”,則表示結(jié)果為負(fù)數(shù),它也是以補(bǔ)碼形式表示的。若要用原碼來表示該結(jié)果,還需要對(duì)結(jié)果求補(bǔ),即

求得X的原碼后只需簡(jiǎn)單地對(duì)符號(hào)位做出處理就可得到對(duì)應(yīng)的真值。

【例2-2】 已知 [X]補(bǔ) = 10011001B,求X

:根據(jù)式(2-4)可得[X] = [[X]補(bǔ)]補(bǔ) = 11100111B,所以X =-1100111B。

2.補(bǔ)碼運(yùn)算規(guī)則

既然在計(jì)算機(jī)中凡是帶符號(hào)的數(shù)一律都是用補(bǔ)碼表示的,因此,對(duì)這些帶符號(hào)數(shù)直接進(jìn)行運(yùn)算時(shí)實(shí)際上是用補(bǔ)碼進(jìn)行的運(yùn)算。那么,這些補(bǔ)碼運(yùn)算的結(jié)果與真值間是什么關(guān)系呢?應(yīng)該如何轉(zhuǎn)換呢?這正是補(bǔ)碼運(yùn)算規(guī)則要闡述的問題。

(1)補(bǔ)碼的加法

設(shè)XY是兩個(gè)帶符號(hào)的二進(jìn)制數(shù),則根據(jù)式(2-1)有

由此得

[X + Y]補(bǔ) = 2n + (X + Y) = (2n + X) + (2n + Y) = [X]補(bǔ) + [Y]補(bǔ)

即兩個(gè)數(shù)和的補(bǔ)碼等于兩個(gè)數(shù)補(bǔ)碼的和。

得到兩數(shù)和的補(bǔ)碼后,再對(duì)其求補(bǔ),即得到兩數(shù)之和的原碼。

(2)補(bǔ)碼的減法

兩個(gè)帶符號(hào)數(shù)相減,有如下基本公式

由此得

[X-Y]補(bǔ) = [X + (-Y)]補(bǔ) = [X]補(bǔ) + [-Y]補(bǔ)

X-Y=X+ (-Y)

即兩數(shù)差的補(bǔ)碼等于被減數(shù)的補(bǔ)碼與減數(shù)的相反數(shù)的補(bǔ)碼之和。這說明了在補(bǔ)碼運(yùn)算中,減法運(yùn)算可以轉(zhuǎn)化為加法來實(shí)現(xiàn)。

這里的關(guān)鍵在于求[-Y]補(bǔ)。如果已知[Y]補(bǔ) = Yn-1Yn-2Y0,那么對(duì)于[Y]補(bǔ)的每一位(包括符號(hào)位)都按位求反,然后再加1,結(jié)果即為[-Y]補(bǔ)

一般稱[-Y]補(bǔ)為對(duì)[Y]補(bǔ)“變補(bǔ)”,即[[Y]補(bǔ)]變補(bǔ) = [-Y]補(bǔ),它有別于[[Y]補(bǔ)]補(bǔ) = [Y]

已知[Y]求[Y]補(bǔ)的過程叫求補(bǔ);已知[Y]補(bǔ)求[-Y]補(bǔ)的過程叫變補(bǔ)。變補(bǔ)并不是一種編碼,而只是一個(gè)操作過程,這一點(diǎn)務(wù)必注意。

【例2-3】 用補(bǔ)碼運(yùn)算求64-65。

:① [64]補(bǔ)= 01000000B,[65]補(bǔ)= 01000001B,[-65]補(bǔ)=10111111B

② 做加法:[64]補(bǔ)+[-65]補(bǔ)=01000000B+10111111B=11111111B

③ 求真值:由于是負(fù)數(shù),要對(duì)結(jié)果除符號(hào)位外取反加1,結(jié)果即為:-(00000001B) =-1。

3.數(shù)值數(shù)據(jù)運(yùn)算的溢出問題

(1)溢出的概念

在微型計(jì)算機(jī)中,帶符號(hào)數(shù)都是以補(bǔ)碼形式存放的。根據(jù)指令,這些數(shù)可以進(jìn)行加法運(yùn)算,也可以進(jìn)行減法運(yùn)算。但在實(shí)際機(jī)器中只有加法器,減法運(yùn)算也是通過加法運(yùn)算來完成的,且運(yùn)算結(jié)果也是用補(bǔ)碼表示的。由于計(jì)算機(jī)的字長(zhǎng)有一定范圍,所以一個(gè)帶符號(hào)數(shù)也是有一定范圍的。

表2-2列出了8位二進(jìn)制數(shù)的概況。由表可以看出,8位二進(jìn)制數(shù)的原碼和反碼形式所表示的數(shù)的范圍都是-127~+127,而補(bǔ)碼表示的數(shù)的范圍是-128~+127。

表2-2 8位二進(jìn)制數(shù)的表示形式

當(dāng)兩個(gè)帶符號(hào)位的二進(jìn)制數(shù)進(jìn)行補(bǔ)碼運(yùn)算時(shí),若運(yùn)算結(jié)果的絕對(duì)值超過了這個(gè)范圍,數(shù)值部分便會(huì)占據(jù)符號(hào)位的位置,從而造成錯(cuò)誤的運(yùn)算結(jié)果,這就是溢出。

【例2-4】 用補(bǔ)碼運(yùn)算求64 + 65。

:① [64]補(bǔ) = 01000000B,[65]補(bǔ) = 01000001B

② 做加法:[64]補(bǔ) + [65]補(bǔ) = 01000000B + 01000001B = 10000001B

結(jié)果為一個(gè)負(fù)數(shù),這顯然是錯(cuò)誤的,原因就在于,在字長(zhǎng)為8位的情況下,64 + 65的結(jié)果是129,超過了單字節(jié)補(bǔ)碼所能表達(dá)的范圍,因此,出現(xiàn)了溢出錯(cuò)誤。

(2)采用補(bǔ)碼進(jìn)行加減運(yùn)算時(shí)要注意的幾個(gè)問題

① 補(bǔ)碼運(yùn)算時(shí),其符號(hào)位要與數(shù)值部分一樣參加運(yùn)算,但結(jié)果不能超出其所能表示的數(shù)的范圍,否則會(huì)出現(xiàn)溢出錯(cuò)誤。無符號(hào)數(shù)的加減運(yùn)算結(jié)果超出數(shù)的范圍的情況稱為產(chǎn)生進(jìn)位或借位,計(jì)算機(jī)中有專門的標(biāo)志用來記錄運(yùn)算時(shí)產(chǎn)生進(jìn)位、借位或溢出的情況,只要適當(dāng)處理這些標(biāo)志,如將進(jìn)位加到高位上或者將借位從更高位上減去就不會(huì)出錯(cuò),所以在多字節(jié)數(shù)的加減運(yùn)算時(shí),必須考慮進(jìn)位和借位的處理。

② 采用了補(bǔ)碼以后,符號(hào)位參與運(yùn)算后如有進(jìn)位出現(xiàn),只要是沒有產(chǎn)生溢出錯(cuò)誤,則可把這個(gè)進(jìn)位舍去,不影響運(yùn)算結(jié)果,運(yùn)算后的符號(hào)就是結(jié)果的符號(hào)。

4. 二進(jìn)制數(shù)的運(yùn)算

微型計(jì)算機(jī)中的運(yùn)算分為兩類:一類是算術(shù)運(yùn)算,包括加、減、乘、除;另一類是邏輯運(yùn)算,包括邏輯乘、邏輯加、邏輯非和邏輯異或等。具體運(yùn)算規(guī)則在先修課程中已有詳盡介紹,在此不再贅述。

算術(shù)運(yùn)算有加、減、乘、除共4種,根據(jù)前面的分析,引入補(bǔ)碼后,減法可以轉(zhuǎn)化為加法來實(shí)現(xiàn),乘法可以利用加法和移位通過編程來實(shí)現(xiàn),而除法也可以利用減法和移位通過程序來實(shí)現(xiàn)。更復(fù)雜的運(yùn)算如指數(shù)、對(duì)數(shù)及其他函數(shù)的運(yùn)算都可運(yùn)用數(shù)值計(jì)算的方法最終轉(zhuǎn)化為四則運(yùn)算式來實(shí)現(xiàn)。由此可以看出,加法是計(jì)算機(jī)最基本的運(yùn)算功能,加法器是計(jì)算機(jī)運(yùn)算器的核心部件。

主站蜘蛛池模板: 水城县| 淳安县| 湾仔区| 汶川县| 宿迁市| 丽水市| 崇义县| 揭阳市| 连云港市| 丰顺县| 广汉市| 长沙市| 乌拉特前旗| 双城市| 翁牛特旗| 岑溪市| 瓮安县| 六盘水市| 四会市| 汾西县| 宝清县| 秀山| 元氏县| 江达县| 离岛区| 安顺市| 仙居县| 沧源| 扶沟县| 磴口县| 洛浦县| 滁州市| 石河子市| 安丘市| 互助| 色达县| 隆化县| 大港区| 富顺县| 霸州市| 嘉荫县|