天天看點

《計算機組成原理》----第2章 計算機算術 2.1 資料是什麼

本節書摘來自華章出版社《計算機組成原理》一書中的第2章,第2.1節, 作 者 computer organization and architecture: themes and variations[英]艾倫·克萊門茨(alan clements) 著,沈 立 王蘇峰 肖曉強 譯, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

“我常說:當你能衡量你正在談論的東西并能用數字加以表達時,你才真的對它有了幾分了解;而當你還不能測量,也不能用數字表達時,你的了解就是膚淺的和不能令人滿意的。盡管了解也許是認知的開始,但在思想上則很難說你已經進入了科學的階段。”

——lord kelvin

“沒有測量就沒有控制。”

——tom demarco,1982

“細節決定成敗。”

——英語諺語

“可以有資料無操作,但不能有操作無資料。”

——佚名

“四舍五入的數字總是錯的。”

——samuel johnson

前面已經介紹了計算機,并解釋了它能夠處理存放在存儲器中的資料。本章将更詳細地介紹計算機所處理的資料。在本書的第二部分,讀者還将看到處理器是怎樣執行指令的。

我們首先介紹資訊的表示,因為它們對後面的大部分内容有重要意義。人們用來表示資訊的方式——無論是數字資料、文本資料或多媒體資料(比如聲音和視訊),對計算機體系結構都有重要影響。資料表示決定了計算機所執行操作的類型,資料從一個位置傳到另一個位置的方法,以及對存儲元件的特性要求。

第2章将從數字表示和計算機運算開始。計算機簡單地将數字和其他所有資訊都表示為二進制形式,因為經濟地設計和制造複雜的大規模二進制電路是比較容易的。讀者将看到二進制整數和負數、小數值以及像π那樣的無理數的表示等内容,還會看到加、減、乘、除等基本運算操作。

本章專門用一節介紹浮點運算,使讀者能處理科學計算中1.3453×1023那樣很大的數和很小的數。浮點運算是非常重要的,因為它的實作決定了計算機執行複雜圖形變換和圖像處理的速度,而且浮點運算對計算的準确度也有很重要的影響。在介紹了浮點數之後,我們還會簡要介紹一些影響形如(p-q)(x+y)的鍊式計算以及超越函數和三角函數精度的因素。

人們所能描述的任何事物都可以被轉換為二進制形式并由計算機處理。計算機中的資料可以表示各種資訊,從本書中的純文字到算術運算中的數字,到cd-rom中的音樂或者到電影。計算機有着不同的用途,可以幫好萊塢藝術家制作出虛拟的人群場景,也可以幫另一些人計算按揭付款。然而在這些應用裡,計算機都是對相同類型的資料(比特)進行同樣的基本操作。

本章将介紹如何用1和0組成的串來表示資訊,特别是數的表示以及數的處理方式。

我們将使用術語“計算機”,而不必擔心會産生任何歧義。40年前或更早以前,人們必須在計算機前加上模拟或數字以區分那時的兩種完全不同的計算機——模拟計算機和數字計算機。我們從以下幾個問題開始介紹:為什麼計算機是數字的,為什麼計算機設計者最終選擇了二進制系統,以及資訊是如何在計算機内表示的。

計算機最初被設計為電腦,使人們能更容易地完成冗長乏味的算術運算。人們習慣用十進制表示數字,是以我們會解釋為什麼資料要從日常的十進制表示轉換為能被計算機存儲和處理的形式,我們還會說明計算機如何表示負數和正數。本章還會介紹計算機如何實作加減法,以及更複雜的乘除法操作。

必須強調的是,二進制數和二進制運算并不神奇。數字計算機和二進制運算的出現僅僅是因為相應的技術實作起來非常劃算。計算機的算術運算與日常生活中的一樣——如果你有7個蘋果并且吃了1個,那麼還剩6個。無論是用十進制運算、掰手指頭數、撥弄算盤珠,還是用計算機,結果都一樣。

計算機中,1992347119845、0.00000000000000000000342、1.234×109或-1.3428×10-12那樣很大或很小的數都是通過浮點運算的機制來處理的。我們介紹了數字計算機是如何存儲和處理這些資料的。不過,因為浮點數可能隻是其真實值的近似,我們将讨論浮點運算的誤差來源以及在進行混合運算時誤差是如何傳播的。我們還會讨論計算機實作平方根、sin和cos等數學函數的方法。

資料是各種各樣的資訊,如數字、文本、計算機程式、音樂、圖像、符号、運動圖像、dna密碼,等等。實際上,資訊可以是能夠被計算機存儲和處理的任何事物。本節将介紹位(bit,或比特)的概念并說明如何用它表示資訊。

計算機記憶體儲和處理資訊的最小機關是位(bit,或比特),它是binary digit(二進制數)這個詞的縮寫。一個比特的值可以是0或1,它是不可分的,因為不能再将它分為更小的資訊機關。

數字計算機将資訊以一組或一串比特(稱作字)的形式儲存在存儲器中。例如,串01011110表示一個8位的字。按照習慣,我們以最低位在最右端的方式書寫二進制串。

如果計算機像人一樣以十進制的方式進行運算,解釋計算機是如何工作的可能要容易一些,簡單地以日常生活中的運算舉例就可以了。但要制造這樣一台計算機需要電路能夠存儲和處理10個十進制數0~9。目前人們還不能制造出價格便宜的、能夠可靠地區分出十個不同電壓等級的電路,隻能制造出便宜的、能夠區分我們稱之為0和1的兩個電壓等級的電路。

《計算機組成原理》----第2章 計算機算術 2.1 資料是什麼
《計算機組成原理》----第2章 計算機算術 2.1 資料是什麼

計算機通常不會每次隻對一個二進制位進行操作,它們會對一組二進制位進行操作。8個二進制位為一個位元組(byte)。現在的微處理器都是面向位元組的,其字長是8位的整數倍(即它們的資料和位址是8、16、32、64或128位)。一個字可以是2個、4個或8個位元組長,因為它的所有位可以被分别組織為2個、4個或8個8位的組。

一般來講,計算機能夠同時處理的位數越多,它的速度就會越快。随着計算機的速度越來越快,價格越來越低,一台計算機一次能處理的位的組數也越來越多。20世紀70年代第一個微處理器一次隻能處理4位資料,而到了20世紀90年代初,64位微機已開始進入個人電腦市場,一些顯示卡還能處理128位或256位寬的資料。

一些計算機制造商用術語“字”(word)表示16位的值(與位元組對應,位元組是8位的值),長字表示32位的值。還有一些制造商則用字表示32位的值,用半字表示16位的值。本教材一般用字表示一台計算機能處理的資訊的基本機關。

前面已經提到過,一串二進制位可以表示任何資料。讀者自然會問表示某個資料需要多少位。如果要将一天中的小時表示為24個不同值中的一個(即0~23),共需要多少位?如何指定這些數字對應的位模式?

圖2-1描述了如何用1位、2位、3位和4位得到一個二進制的值序列。我們從圖2-1最左邊隻有一位的情況開始,這時可以沿着兩條路徑中的一條前進——向上表示該位為0而向下表示該位為1。增加第2位将得到4條從起點開始到狀态00,01,10和11的路徑。增加第3位将得到抵達狀态000,001,010,011,100,101,110和111的8條路徑。最後,增加第4位将得到從狀态0000到1111的16條路徑。

每當數字增加1位時,路徑的總數将翻一倍。4位得到16條路徑,5位得到32條路徑,依此類推。一個n位的字将得到2n條不同的路徑或位模式。一個8位的位元組将得到28=256個可能的值,一個16位的字将得到216=65 536個不同的值。為了用二進制數表示任何一個擁有最多n個值的量,應找到一個使不等式n≤2m成立的最小位數m。例如,要表示整數百分數(即n=0,…,100),m應為7,因為100≤27。但這裡并沒有指出如何最優地安排這m位對應的2m個位模式。從圖2-1中可以看出這些位被放在了相同的位置上(2.2節将對其進行詳細讨論)。我們很快将會看到數字值有幾種不同的表示方式。

《計算機組成原理》----第2章 計算機算術 2.1 資料是什麼

資訊表示

一個n位的字可以表示2n個不同的位模式,圖2-1描述了n=1,2,3和4的情況。那麼一個n位的二進制字又可以表示什麼呢?最簡單的答案是什麼也表示不了,因為一個由二進制1和0組成的串沒有任何内在含義。怎樣解釋一個特定的二進制數隻取決于程式員賦予它何種含義。在介紹二進制運算之前,我們簡要介紹一下一般的二進制碼而不考慮數字。以下是一些能夠用字表示的對象。

指令 字長為32位或更長的計算機用一個字來表示cpu能夠完成的操作(8位或16位計算機用多個字表示一條指令)。指令的二進制編碼與其功能之間的關系由計算機設計者決定。例如,一台計算機上表示“a加b”的二進制序列可能與另一台計算機上的完全不同。

數量 一個字或多個字都可以用來表示數量。數可被表示為多種格式(如bcd整數、無符号二進制整數、有符号二進制整數、二進制浮點數、整數複數、浮點複數、雙精度整數,等等)。位元組10001001可能在一個系統中表示數值–119,在另一個系統中表示137,而在第三個系統中表示89。程式員必須按照數的類型對其進行操作,用數字8去乘字元串“john”的二進制表示也是完全可以的。

《計算機組成原理》----第2章 計算機算術 2.1 資料是什麼

字元 字元是一個叫作“字母表”的集合中的元素。拉丁或羅馬字母表中的字母、數字字元(a-z,a-z,0-9)和*、-、+、!、?等符号都被配置設定了二進制值,是以可以在計算機記憶體儲和處理。iso 7位字元碼或ascii碼(美國資訊交換标準代碼)是在計算機工業中應用得非常廣泛的一種編碼,它用7位表示一個字元,一共可以表示27=128個不同的字元。其中有96個字元是可列印字元。其餘32個是不可列印的,用于完成回車、倒退、換行等特殊功能。表2-1列出了每個ascii碼的值及其所代表的字元。因為計算機都是面向位元組的,它通常可以通過在最高位前補0的方法将7位ascii碼轉換為8位——我們也會使用這個方法。

為了将一個ascii字元轉換為對應的7位二進制碼,應将該字元在ascii碼表的行号作為ascii碼的高3位,列号作為低4位。表2-1用二進制和十六進制(稍後将介紹十六進制數)兩種形式對各行和列編号。例如,字母“z”的ascii表示為5a16或10110102。

十進制數字字元0,1,2,3,4,5,6,7,8和9對應的ascii碼分别是3016,3116,3216,3316,3416,3516,3616,3716,3816和3916。例如,數字字元4用ascii碼001101002表示,而數值4用000001002表示。當按下鍵盤上的“4”後,計算機得到的輸入是00110100而不是00000100。當讀入一個來自鍵盤的輸入或将一個輸出送往顯示器時,都必須在數字字元的ascii碼和數字的值之間進行轉換。在進階語言裡,這個轉換是自動完成的。

表2-1左邊第三、四兩清單示0000000~0011111之間的ascii碼對應的字元,其中沒有字母、數字或符号。這兩列字元都是不可列印的,要麼用于控制列印機或顯示裝置,要麼用于控制資料傳輸鍊路。ack(應答)和syn(同步空閑)等資料鍊路控制字元與通信系統有關,通信系統将要傳送的字元和管理資訊流所需的特殊字元混合在一起。這樣的系統已不像之前那樣受歡迎,資料鍊路通過其他機制進行控制。

《計算機組成原理》----第2章 計算機算術 2.1 資料是什麼

7位的ascii碼一共可以編碼128個字元,為了支援?、?和é等重音字元,它已被擴充為8位的iso 8859-1拉丁編碼。但因為這種編碼不适用于世界上的許多語言,如漢語和日語,人們又設計了unicode 16位編碼,表示這些語言中的文字。unicode的前256個字元被映射到ascii字元集上,使得ascii碼與unicode的轉換非常容易。java語言将unicode作為其字元表示的标準方法。

有時需要對某種字元編碼進行擴充或增強(例如,使之含有另一種語言中的文字元号)。增加每個字元的編碼位數或者使用轉義序列都可以擴充現有的字元編碼。将7位的iso/ascii字元集擴充為8位,可以得到兩個128個字元的字元集。如字元最高位為0,則其餘7位代表128個标準iso/ascii字元中的一個。反之,若字元最高位為1,其餘7位将表示128個新字元中的任意一個(比如非拉丁語字元或者甚至是圖形符号)。

使用轉義序列是另一種擴充字元集的方法,轉義序列用一個特殊字元說明其後的字元(或字元串)的含義将按照與标準或預設字元集中不同的方式進行解釋。例如,iso/ascii的換碼字元esc就用來說明緊跟在其後的字元有新的含義。

圖像、聲音和視覺 數字計算機處理大量表示聲音、靜态圖像和視訊的資料。也許有人會說一幅照片的大小相當于1000個詞,但在數字世界中并非如此。如果我們假設平均每個詞中含有5個ascii字元和1個空格,那麼1000個詞共有6000個字元或大約6kb。一台全畫幅數位單反相機所拍攝的raw(未編碼)格式照片,每張的大小約為30mb。此時,一張照片的大小是1000個詞的5000倍。

組成照片的基本機關是像素(picture element),每個像素的大小可以是8位(單色)或24位(三基)。一張高分辨率照片中可能有超過4k×3k個像素。運動圖像的情況更甚,因為視訊将作為一串靜态圖像依次傳輸,每秒發送60次(60次/s)。實際情況并不像資料所反映的那樣糟糕,因為無論是靜态圖像還是動态圖像,都可以進行壓縮以減少其資料量——壓縮比可以達到10倍甚至更高。靜态圖像用jpeg算法壓縮,動态圖像則用mpeg算法壓縮。在介紹處理多媒體應用的專用指令集時我們還會回到這一話題。如果要進行實時圖像處理,需要很大的存儲容量,很高的傳輸帶寬,以及很強的處理能力。我們有理由認為高性能計算機技術在過去10年的發展受到了多媒體應用需求的驅動。下面舉一個與多媒體有關的問題規模的例子,請考慮一架載客量為800人的空客a380的飛行娛樂系統的設計,理論上所有800名乘客都可以使用該系統在50餘部影片内選擇一部來觀看——所有這些都是實時進行的。

聲音的存儲和處理曾是計算機設計者面臨的巨大挑戰,但與圖像相比這已不再是一個嚴峻的問題,因為音頻處理所需的計算、存儲和傳輸帶寬已經完全處于現代計算、存儲和傳輸裝置的能力範圍内。奈奎斯特抽樣定律(nyquist ttheorem)指出,如果以至少兩倍于音頻流最高頻率的速率對初始波形進行采樣,就可以重新構造出聲音信号。16位采樣對除了最高品質音頻外的其他所有音頻都足夠了。是以,以32k次/s的速率進行聲音采樣共需215×2位元組/s=216位元組/s,這在今天是毫無問題的。使用進階心理聲學模型編碼方法(見第5章)和mp3等算法對聲音進行壓縮,可以将其所需帶寬降到最初的十分之一。

多媒體信号與大多數其他形式的資料的編碼之間有一個重要的差別。通常資料必須進行精确編碼,它的存儲或處理都不會丢失資訊。沒人希望文本檔案或信用卡賬單中出現随機錯誤。這種編碼被稱為無損的,它表明無論進行多少次編碼或解碼,總可以得到同樣的結果(通過将頻繁出現的詞或一組字母替換為短語來壓縮文本檔案的zip編碼算法是一個很好的無損壓縮的例子)。圖像和聲音編碼(mpeg、jpeg和mp3)則采用有損編碼,意味着編碼會造成不可逆的品質損失。這種有損編碼充分利用了“如果不能輕易地覺察到,人們就不會過于關注細節的損失”這一原理。

繼續閱讀