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

1.2 計算機中數值數據信息的表示

1.2.1 機器數和真值

計算機在本質上只能識別0、1表示的二進制數碼。為了表示正數和負數,專門選擇一位二進制數來表示數的符號,該位為0,表示正號;該位為1,表示負號,通常選擇最高位作為符號位。

這就是說,數的符號在計算機中也數值化了。一個數在機器(計算機)中的表示形式稱為機器數,而數本身的實際值叫做真值(機器數真值)。真值可以用二進制數表示,也可用十進制數表示,但根據習慣,常用十進制數表示,如圖1-1所示。

圖1-1 機器數真值

機器數有如下特點:

(1)機器數的正、負號是數值化的。

(2)機器數所能表示的數的范圍受到機器(計算機)字長的限制。

那么什么是計算機字長呢?我們先來解釋幾個計算機中的常用術語。

① 位(bit):是計算機所能表示的最小數據單位,它只有兩種狀態0和1。要想表示更大的數,就得把更多的位組合起來作為一個整體,每增加一位,所能表示的數就增大一倍。

② 字節(Byte):一個8位二進制數稱為1字節,它是計算機處理數據的基本單位(B)。在計算機中,其存儲器容量大小常以字節數的多少來度量。常用的4種度量單位是KB、MB、GB和TB,其大小分別為:

1KB=210B=1024B

1MB=210×210B=1024KB

1GB=210×210×210B=1024MB

1TB=210×210×210×210B=1024GB

③ 字(Word):作為單位一般指16位二進制數,但也把計算機處理數據時,處理器通過數據總線一次存取、加工和傳送的數據位數稱為字,這時字通常由1字節或若干字節組成。

④ 字長(Word Length):指處理器的二進制位數。8位微處理器的字長為8位;16位微處理器的字由2字節構成;32位微處理器的字則由4字節構成。字長是衡量計算機性能的一個重要標志,字長越長,性能越強,精度越高。

(3)小數點不能直接標出,需要按一定方式約定小數點的位置。

需要說明的是,在計算機系統開發和應用中會涉及二進制(Binary,簡寫B)、八進制(Octal,O或Q)、十進制(Decimal,D)和十六進制(Hexdecimal,H)等數制,其中十六進制最常用、最方便,它與二進制的關系簡明、直接,并用0~9,A~F(H)代表0~15(D)。

1.2.2 數的表示方法——原碼、反碼和補碼

為妥善解決符號數值化的表示與運算問題,設定了機器數x的三種不同編碼形式,即原碼、反碼和補碼。分別記作[x]、[x]和[x]

1.原碼

x=x1x2xn-1,其中xi為一位二進制數,i=1,2,…,(n-1)。n位二進制數

一個數的原碼,就是數值部分為絕對值,加上用0和1分別表示數的符號+和-的機器數。

【例1-1】 x1=67=+1000011,[x1]=01000011;x2=-67=-1000011,[x2]=11000011。

在原碼表示法中,根據定義,數0的原碼有兩種不同形式(設字長為8位):

[+0]=00000000,[-0]=10000000

原碼表示簡單易懂,而且與真值的轉換方便。但原碼表示的數不便于計算機運算,因為在兩原碼數運算時,首先要判斷它們的符號,然后再決定用加法還是用減法,導致機器的結構相應地復雜化或增加機器的運算時間。為解決上述問題,引入反碼和補碼表示法。

2.反碼

x=x1x2xn-1,其中xi為一位二進制數,i=1,2,…,(n-1)。定義

式中,

根據定義,正數的反碼與原碼相同;對于負數,反碼的符號位為1,其余位為數值位按位取反。

【例1-2】 x1=83=+1010011,[x1]=01010011;x2=-83=-1010011,[x2]=10101100。

在反碼表示法中,根據定義,數0的反碼也有兩種不同形式(設字長為8位):

[+0]=00000000,[-0]=11111111

3.補碼

引入補碼的概念,一方面是為了解決原碼、反碼存在的一些問題,另一方面是為了將計算機中的加、減運算簡化為單純的加法運算,這種運算上的特性與補碼本身的定義有關。

(1)同余的概念和補碼

設有兩個數a=17,b=27,若用10去除ab,則它們的余數均為7,我們稱17和27在以10為模時是同余的,并記作17=27 (mod 10)。

或者說,17和27在以10為模時是相等的。此處的模是一個計量系統所能表示的最大量程(或一個計量單位稱為?;蚰担?。

由同余概念,不難得出

a+M=a (mod M),a+2M=a (mod M)

因此當a為負數時,如a =-4,在以10為模時,有

-4+10=-4 (mod 10) 即 6=-4 (mod 10)

上式說明,在以10為模時,-4與+6是相等的。我們稱+6為-4的補碼,或者說+6與-4對模10來說互為補數。有了補碼的概念,就可將減法轉化為加法(加補碼)來進行。如:

7-4=7+6 (mod 10)

該式說明,在以10為模時,7減4可以通過7加-4的補碼6來進行,而所得結果是相同的(只要在加補碼6時,將所產生的進位舍棄即可,這正是以10為模的意思)。

現在把同余和補碼的概念推廣到二進制數。設計算機字長為n位,那么其模為2n,即

這就是說,字長n位的機器,2n在機器中僅能以n個0表示。或者說,2n和0在機器中表示的形式是一樣的。

(2)補碼求法

x=x1x2xn-1,其中xi為一位二進制數,i=1,2,…,(n-1)。定義

或寫成

① 正數的補碼。[x]=[x]=[x]

【例1-3】 [+127]=[+127]=[+127]=

② 負數的補碼。先求負數的反碼,然后在反碼最低一位上加1就得到該負數的補碼。

還可以用形式上更簡便的方法求得負數x的補碼:符號位為1,將原數值中最右邊一個1及其后面的0保持不變,而最右一個1以左的各位按位取反。

【例1-4】 x1=-0011000,[x1]=11101000;x2=-1000000,[x2]=11000000。

根據定義,數0的補碼僅有一種形式:[+0]=[-0]=

若已知一個負數的補碼,再取一次補,則 {[x]}=[x]。

【例1-5】 設[x]=10010111,求x的真值。

所以,[x]=11101001,x=-1101001=-105。

當已知8位二進數補碼符號位為1時,表示該數為負數。此時要注意,其余幾位不是該二進制的數值,一定要把它們按位取反,且在最低位加1,才是該二進制數的值(真值)。

十進制數及其對應的8位二進制數的原碼、反碼和補碼表示如表1-1所示。

表1-1 十進制數及其對應的8位二進制數的表示方法

小結:

(1)有符號數三種編碼的最高位都是符號位。符號位為0,表示真值為正數,其余位為真值;符號位為1,表示真值為負數,其余位除原碼外,不再是真值。對于反碼,只需按位取反,便是真值;對于補碼,還需按位取反加1,才是真值。

(2)對正數,三種編碼是一樣的,即[x]=[x]=[x]。對于負數,三種編碼就不同了。所以說,原碼、反碼和補碼的實質是用來解決負數在機器中的表示而引入的編碼方法。

(3)8位二進制數原碼、反碼和補碼所能表示的數值范圍不完全相同。它們分別是-127~+127,-127~+127和-128~+127。其中對0的表示也不盡相同,原碼和反碼有兩種表示方法,補碼只有一種表示方法。

(4)當計算機采用不同的碼制時,運算器和控制器的結構將不同。采用原碼形式的計算機稱原碼機。類似地,有反碼機和補碼機。小型計算機和微型計算機大多為補碼機(實際上原碼機與反碼機已不采用了)。

1.2.3 補碼的運算

從以上討論可知,在微型計算機中,有符號數以補碼的形式在機器中存在和運算。這主要是因為補碼的加、減運算比原碼簡單;符號位與數值位一起參加運算,并能自動獲得正確結果。

xy是兩個正數,可以證明,兩個數和的補碼等于兩個數補碼的和:

[x+y]=2n+(x+y)=(2n+x)+(2n+y)=[x]+[y]

同樣也可以證明,該兩數差的補碼等于被減數的補碼與減數負值的補碼(或稱求補)之和。

[x-y]=2n+(x-y)=2n+x+2n+(-y)=[x]+[-y]

上式說明,在補碼運算中,兩數差的運算可簡化為單純的加法運算。

x的補碼直接由補碼定義可得到,而[-y]可通過對[y]“連同符號位在內一起變反加1”得到(稱為“求補”)。

【例1-6】 [y]=00000100,[-y]=11111100。

【例1-7】 計算x-y。x,y均為正數,且xy。設x=122,y=37,字長n=8。

解:

求得真值為正數(01010101)2=85。

【例1-8】 計算x-y。x,y均為正數,且xy。設x=64,y=65,字長n=8。

解:

求真值:(11111111)={(11111111)}=- (00000001)=-1。

【例1-9】 計算x+yx,y均為正數。設x=64,y=65,字長n=8。

解:

此時,兩個正數相加得出負數,顯然是錯誤的。這種情況稱為“溢出”。由表1-1知,8位計算機中,由于最高位為符號位,剩下的數值位只有7位,表示數的范圍是-128~+127。當兩個正數相加其和大于127或兩個負數相減其絕對值之和大于128時,就產生了“溢出”,致使結果出錯。推廣到字長n位的符號數,最高位為符號位,n-1位表示數值。能表示的最大值為2n-1-1(即n-1個1)。當運算結果超過此值,就會產生“溢出”。

小結:

(1)補碼運算時,參加運算的兩個數均為補碼,結果也是補碼,需轉換才能得到真值。

(2)可以將減法變為加法運算,以簡化硬件設計。

(3)運算時:① 符號位與數值位一起參加運算;② 符號位產生的進位可舍棄;③ 要保證運算結果不超過補碼所能表示的數的最大范圍,否則將產生“溢出”錯誤。為此,在計算機中設有專門電路用以判斷運算結果是否產生溢出,并設置溢出標志告知本次運算的結果的狀態。

(4)無符號數和有符號數的加法運算可用同一電路完成。

1.2.4 定點數與浮點數

在計算機中,不僅要處理整數運算,而且也要處理小數運算,如何處理小數點位置是十分重要的,通常用定點法和浮點法來表示小數點的位置。

(1)定點表示法。就是小數點位置在數中固定不變。例如:

1.100101,0.100101,110.0101

一般來說,小數點位置固定在哪個位置上并無限制,但為了使用簡便,在計算機中有兩種常用的定點數。

① 定點純小數。把小數點固定在最高數值位左邊,在小數點左邊設有一位符號位,小數點本身不占位,其格式為:

② 定點純整數。把小數點固定在最低數值位右邊,最高位仍為符號位,小數點本身不占位,其格式為:

定點數的這兩種表示法,在計算機中均有采用。但對一臺機器而言,采用哪種方法,需事先約定。

【例1-10】 有如下兩個8位二進制數:

【例1-11】 有例1-10中同樣兩個數,但小數點位置不同,則有

從上面兩個例子可以看出,定點整數和定點小數在格式上毫無差別,這是因為定點數的小數點是隱含的,但它們的真值卻不相同。此外,相同位數、不同碼制的定點數表示的數的范圍也不相同。

同一臺計算機可處理的整數類型往往有很多種,以目前廣泛使用的Pentium機為例,除了無符號整數之外,它還有三種不同類型的整數,如表1-2所示。

表1-2 Pentium處理器的三種整數類型

由于定點數是將小數點的位置固定,因此運算起來很不方便。一方面,它要求對所有原始數據要用比例因子化成小數或整數,算出結果又要用比例因子折算成真值;另一方面,這種方法所表示的數的范圍小、精度低。所以有必要引入另一表示方法——浮點表示法。

(2)浮點表示法。為了在位數有限的前提下,盡量擴大數的表示范圍,同時又保持數的有效精度,計算機往往采用浮點數表示數值。在浮點表示初期,把一個數通過改變小數點位置表示成2的p次冪和絕對值小于1的數S相乘的形式:

式中,N稱為浮點數或實數;SN的尾數,它是數值的有效數字部分,通常用帶符號的定點小數表示,一般用原碼表示;2是N的底數,是該進位計數制的基數,在計算機中不出現,是隱含的;p是指數,稱為階碼,通常為帶符號整數,一般用補碼表示。階碼p的大小決定了數的范圍,尾數S的長短則規定了數的有效數字的位數(精度)。在計算機中,pS均為二進制數。

【例1-12】 試將以下數表示成浮點數形式。

1011.1101B=(0.10111101B)×24 =(0.10111101)×2100B

0.00101101B=(0.101101B)×2-2 =(0.101101)×2-10B

-111001010B=(-0.111001010B)×29 =(-0.111001010)×21001B

浮點數在機器中的一種表示形式如下:

也就是說,若要在機器中表示一個浮點數,階碼和尾數要分別表示,且都有自己的符號位。

通常,用一位二進制數pf表示階碼的符號位。當pf=0時,表示階碼為正;當pf =1時,表示階碼為負。同樣,用一位二進制數Sf表示尾數的符號位。當Sf =0時,尾數為正;當Sf =1時,尾數為負。

若浮點數中1/2≤S<1,則稱該浮點數為規格化了的浮點數。

【例1-13】 (-18.75)10=(-10010.11)2=(-0.1001011)×2+101。

假定尾數用8位二進制數表示,階碼用4位二進制數表示,且均含符號位,尾數用原碼表示,則有

或表示成(1.1001011)×(10)0101

【例1-14】 (0.078125)10=(0.000101)2=(0.101)×2-11。

同上例

階碼用補碼表示,尾數用原碼表示。

或表示成(0.1010000)×(10)1101

最后介紹浮點數表示數的范圍,若浮點數采用下列格式:

則浮點數表示數的范圍是。

由于指數可以選用不同的編碼(原碼、補碼等),尾數的格式和小數點位置也可以有不同規定,因此浮點數的表示方法不是唯一的。不同計算機有不同的規定,這就引起了相互間數據格式的不兼容性。為此,美國電氣與電子工程師協會(IEEE)制定了有關的工業標準,已被眾多計算機制造廠商所采用。

浮點數的長度可以是32位、64位甚至更長,位數越多,可表示的數的范圍越大,精度也越高。

以當今流行的Pentium處理器中的浮點數為例。Pentium處理器中的浮點數格式完全符合IEEE標準,它表示成如下形式:

式中,(-1)Sf是該數的符號位,Sf=0或1,0表示正,1表示負;p是指數,它是一個帶偏移量的整數,表示成無符號整數;(b0.b1b2b3bS-1)是尾數,其中bi=0或1;S是尾數的長度,它表示尾數共S位。

表1-3為Pentium處理器中三種不同類型浮點數的格式。

表1-3 Pentium處理器中三種不同類型浮點數的格式

Pentium處理器浮點數的尾數最高位b0總是1,且和小數點一樣隱含,在機器中并不明確表示出來。

【例1-15】 將十進制數178.125表示成單精度浮點數。

首先,將十進制數178.125表示成二進制實數:(178.125)10=(10110010.001)2。

然后,再將二進制實數表示成規格化形式: 10110010.001=1.0110010001×27。

因為指數等于7,加上偏移量127之后,p=7+127=134=(10000110)2。

因此,178.125的單精度浮點數表示為:

【例1-16】 單精度浮點數001111110 10110000000000000000000的十進制數值是多少?

先計算指數。因為 p=(01111110)2=(126)10,所以,指數=126-127=-1。

再計算尾數。規格化的尾數是 +1.1011。

所以該浮點數的數值為 +1.1011×2-1=+0.11011=(+0.84375)10。

【例1-17】 下面4個等式中,等號左面是二進制實數,等號右面是其等值的單精度浮點數表示。

0.11010001×210110=0 10010100 10100010000000000000000

-0.11010001×210110=1 10010100 10100010000000000000000

0.11010001×2-10010=0 01101100 10100010000000000000000

-0.11010001×2-10010=1 01101100 10100010000000000000000

需要指出的是,任意位精度浮點數可由定點處理器計算生成,而上文所述的屬于機器精度浮點數,其精度由特定格式規定,后者的應用更為廣泛。

相對于整數(定點數)的表示形式,浮點表示法所表示的數據范圍大、精度高,但同時增加了運算的復雜度和時間開銷。因而眾多計算機系統中都將浮點運算集成為單獨硬件部件——浮點運算單元(FPU,Floating-Point Unit),以增強浮點處理的能力。Intel公司在1980年發布了8087數學協處理器(浮點運算器件),該協處理器主要負責浮點運算,其數據類型為IEEE標準的格式。8087只能與8086/8088配合使用,將浮點運算結果傳輸給CPU。此后,Intel公司還相繼推出了80287和80387協處理器。1989年發布的Intel 486DX中,已經將浮點運算部件做在CPU內部,而不再是作為一個選件。而其他的主流微處理器,如Motorola的68040和PowerPC也均把浮點運算部件集成在了內部。

1.2.5 BCD碼及其十進制調整

由于二進制數具有很多優點,所以到目前為止在計算機內部多采用二進制運算。但是,二進制數書寫起來很長,讀起來也不方便。考慮到人們習慣,通常,數在送入機器之前,仍采用十進制編碼,運算結果也以十進制數輸出。這就要求在輸入時將十進制數轉換成二進制數,輸出時將二進制數轉換成十進制數,這項工作一般由機器自動完成。因而產生了一種適合于十進制數的二進制代碼的特殊形式,即用4位二進代碼來表示一位十進制數,簡稱BCD(Binary Coded Decimal)碼。

要表示一個十進制數碼,至少需要4位二進制數組合,其編碼的選擇有很多種方法,其中常用的BCD碼如表1-4所示。而最常用的是用0~9各數字所對應的二進制數作為代碼,稱為8421 BCD(簡稱NBCD)碼。

表1-4 常用BCD碼編碼表

從表1-4可見,8421碼與十進制數的對應關系最直觀,轉換也十分簡單,只需將十進制數的各位數字用與其對應的一組4位二進制數代替即可。下文所述的BCD碼僅指8421BCD碼。

【例1-18】 將十進制數83.6轉換成BCD碼。

(83.6)10=(1000 0011.0110)BCD

【例1-19】 將BCD碼1001 0111.0100 0010轉換成十進制數。

(1001 0111.0100 0010)BCD=(97.42)10

要注意,BCD碼與真正的純二進制數是不同的。它貌似二進制數,實為十進制數。通常用在計算的輸入/輸出設備中,作為計算機中二進制數與人們日常用的十進制數之間的一種過渡性編碼,以簡化人機關系。

由于BCD碼只是將每個十進制數用4位二進制數來表示,而每組4位二進制數之間仍然是逢十進一的關系。因此,如果將這種BCD碼直接交由計算機去運算,由于計算機總是將其作為二進制數來處理,結果可能會出錯。

【例1-20】 求BCD碼的7+6=?

1101為非法BCD碼,運算結果出錯,7+6的正確BCD碼應為(00010011)BCD

為了得到正確的BCD碼的運算結果,必須對二進制數的運算結果進行調整,使之符合十進制數的運算和進位規律。這種調整稱為十進制調整,其規則如下:

(1)若兩個BCD數相加的結果大于9(1001),則應作“加6(0110)修正”。

(2)若兩個BCD數相加的結果在本位上并不大于9(1001),但卻產生了進位,相當于十進制數運算大于等于16,則也應“加6(0110)修正”。

【例1-21】 求BCD碼54+48=?

低4位之和為1100,應作加6修正,修正后高4位又為1010,還應再作一次加6修正。故最終結果為102。

這里需要說明一點:實際上,在計算機中有十進制調整指令DAA(DAS),無論對加法或減法,機器能按照規則自動進行調整(加法時,“加6修正”;減法時,“減6修正”)。

BCD碼在計算機中有兩種表示方法,一種是用1字節表示兩位十進制數,稱為壓縮BCD,如(56)10=(01010110)BCD;另一種稱作非壓縮BCD,它用8位二進制數表示一位十進制數,如(56)10=(0000010100000110)BCD。前者占內存少,利用率高;后者占內存多,但其運算及調整相對簡單,在某些場合下使用。

主站蜘蛛池模板: 重庆市| 黄梅县| 修文县| 祥云县| 蚌埠市| 海兴县| 贵南县| 房山区| 都兰县| 瓦房店市| 康马县| 揭西县| 武冈市| 乐陵市| 绩溪县| 民权县| 婺源县| 儋州市| 都匀市| 五峰| 南安市| 会宁县| 甘南县| 历史| 武汉市| 乌审旗| 许昌县| 阿克陶县| 扶沟县| 南溪县| 蓬溪县| 汾阳市| 讷河市| 休宁县| 通州市| 通城县| 疏勒县| 奉节县| 通山县| 博乐市| 筠连县|