計算機科學導論課件第2章-第三版_第1頁
計算機科學導論課件第2章-第三版_第2頁
計算機科學導論課件第2章-第三版_第3頁
計算機科學導論課件第2章-第三版_第4頁
計算機科學導論課件第2章-第三版_第5頁
已閱讀5頁,還剩90頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

進位制的概念不同進制間的轉(zhuǎn)換計算機中的二進制四則運算一切都是邏輯(Logic)計算機中的存儲談0與1的美

1/TP

第2章神奇的0與1第1節(jié)進位制的概念

2十進制(Decimal)二進制(Binary)八進制(Octonary)與十六進制(Hexadecimal)

基數(shù)(Base)與位權(quán)(Weight)十進制(Decimal)

3十進制的整數(shù)391,觀察可發(fā)現(xiàn)該數(shù)具有2個性質(zhì):每一位都介于0~9之間;這個數(shù)可以分解成為39110=3×102+9×101+1×100。逢十向高位進一我們通常用數(shù)的右下標,表明它的進位制,例如39110就表示一個十進制數(shù)391。有的書也用(391)10表示同樣的意義。在這本書里,我們約定如果一個數(shù)不加下標就默認它是十進制數(shù)。二進制(Binary)

4二進制是逢二進位,二進制的數(shù)是由0或1組成的。十進制中的0、1、2、3、4,在二進制中對應的用0、1、10、11、100來表示。計算機采用的是二進制在計算機的世界里,二進制數(shù)的1位稱為1比特(bit),把連續(xù)的8個比特稱為一個字節(jié)(byte)。二進制只有兩個十進制數(shù)8(=23)用二進制表示需要3個比特,十進制數(shù)4096(=212)用二進制表示需要12個比特。

二進制數(shù)的長度隨著數(shù)值增大快速增長。因為二進制只有兩個可用的數(shù),較大的數(shù)就需要用很多位比特來表示。八進制(Octonary)與十六進制(Hexdecimal)

5八進制數(shù)的一位數(shù)表示0~7之間的數(shù)值,逢八進位,八進制的數(shù)是由0~7組成的。十六進制數(shù)的一位數(shù)表示0~15之間的數(shù)值,逢十六進位,而人類世界的十進制數(shù)位只能表示0~9因此在十六進制中,我們用A、B、C、D、E、F分別代表十進制的10、11、12、13、14、15。進制基數(shù)進位原則基本符號二進制(Bin)八進制(Oct)十進制(Dec)十六進制(Hex)281016逢2進1逢8進1逢10進1逢16進10,10,1,2,3,4,5,6,70,1,2,3,4,5,6,7,8,90,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F基數(shù)(Base)與位權(quán)(Weight)

6如果某一個進制采用R個基本符號,我們就稱它為基R進制,R稱為進制的“基數(shù)(base)”。例如二進制的基數(shù)是2,十進制的基數(shù)是10。進制中每一位的單位值稱為“位權(quán)(weight)”。在整數(shù)部分,最低位的位權(quán)為R0,第i位的位權(quán)為Ri;對于小數(shù)部分,小數(shù)點向右第j位的位權(quán)R-j。在十進制中,個位的位權(quán)是100,百位的位權(quán)是102,所以數(shù)7在個位時,它的值是7,在百位時它的值就是700=7×102。在二進制中,最低位的位權(quán)是1=20,所以數(shù)1在最低位的值是1=1×20。小數(shù)是同樣的道理。第2節(jié)不同進制間的轉(zhuǎn)換

7二進制數(shù)轉(zhuǎn)換為十進制數(shù)R進制數(shù)轉(zhuǎn)換為十進制數(shù)十進制數(shù)轉(zhuǎn)換為二進制數(shù)十進制數(shù)轉(zhuǎn)換為R進制數(shù)二、八、十六進制的巧妙轉(zhuǎn)換進制轉(zhuǎn)換

8任何整數(shù)都可用各種進制表示如何證明?最簡單的證明方式就是任意R進制的數(shù),都可以轉(zhuǎn)換成十進制的形式:R1進制十進制R2進制二進制數(shù)轉(zhuǎn)換為十進制數(shù)

9把一個二進制數(shù)轉(zhuǎn)換為十進制數(shù)的時候,基本方法是用某位的數(shù)值(0或者1)乘以該位的位權(quán)。可以利用查表的方法輔助理解。例如下表:B110110101二進制位權(quán)282726252423222120十進制值25612864321684211101101012

=1×28+1×27+0×26+1×25+1×24+0×23+1×22+0×21+1×20=256+128+32+16+4+1=437二進制數(shù)轉(zhuǎn)換為十進制數(shù)

10計算機并不是用查表的方式來轉(zhuǎn)換進制的,實際上,計算機里的進制轉(zhuǎn)換是通過一定的“算法”完成的。請回顧二進制數(shù)的組成:1101101012=1×28+1×27+0×26+1×25+1×24+0×23+1×22+0×21+1×20將二進制數(shù)的每一位都用一個符號替代,例如第i位記為ai,那么n+1位二進制數(shù)A就可以表示為A=anan-1…a1a0。那么,二進制數(shù)A轉(zhuǎn)換為十進制數(shù)的算法就是:A=an×2n+an-1×2n-1+…+a1×21+a0×20程序示例-二到十進制的轉(zhuǎn)換

11程序定義了一個變量d來存放轉(zhuǎn)換后的十進制數(shù)值,并把d的初始化值設為0。在“for”循環(huán)中實現(xiàn)對二進制數(shù)每一位數(shù)值和位權(quán)的乘積和累加。函數(shù)len(b)獲得的是字符串b的長度,例如len("1010")=4。字符串b其實是一個數(shù)組,b[0]表示數(shù)組的第一個單元,存放的是二進制數(shù)的最高位,位權(quán)為2len(b)-i-1。

b[len(b)-1]表示數(shù)組的最后一個單元。第6行語句計算位權(quán)#<程序2.1:2-to-10進制轉(zhuǎn)換>b=input(“Pleaseenterabinarynumber:”)d=0;foriinrange(0,len(b)):ifb[i]=='1':weight=2**(len(b)-i-1)d=d+weight;print(d)程序示例-改進后二到十進制的轉(zhuǎn)換

12計算機中執(zhí)行指數(shù)運算往往比單純的加減乘除運算要復雜得多,因此也比較費時。為了更快地完成進制轉(zhuǎn)換,對前面的python程序進行了改進。首先算出二進制數(shù)最高位的位權(quán),即weight=2**(len(b)-1)。在隨后的for循環(huán)中,不需要重復計算2的i次方冪了,而是用整數(shù)除法,即weight=weight//2,得到每一位的位權(quán)。第8行中的“//”是整數(shù)除法#<程序2.2:改進后的2-to-10進制轉(zhuǎn)換>b=input(“Pleaseenterabinarynumber:”)d=0;weight=2**(len(b)-1);foriinrange(0,len(b)):ifb[i]=='1':d=d+weight;weight=weight//2;print(d)R進制數(shù)轉(zhuǎn)換為十進制數(shù)

13把前頁的進制轉(zhuǎn)換算法推廣到把R進制數(shù)轉(zhuǎn)換為十進制數(shù)的算法。R進制中各位的位權(quán)是以R為底的冪。對于一個R進制數(shù)A=anan-1…ai…a1a0而言,它的一個數(shù)位ai乘以該位的位權(quán)就得到該位的值,把每一位的值加起來就得到R進制數(shù)A在十進制中的值:A=anan-1…ai…a1a0=an×Rn+an-1×Rn-1+…+ai×Ri+…+a1×R1+a0×R0,其中n和i為正整數(shù),且0≤i<n,Ri是第i位的權(quán)。數(shù)如前面所說,在R進制中的數(shù)使用0~(R-1)個數(shù)符號來表示,因此,數(shù)ai應滿足0≤ai<R。通過這個算法,計算機就能很容易地對各種進制進行轉(zhuǎn)換。例如將八進制數(shù)10238轉(zhuǎn)換為十進制數(shù)的例子:(1023)8=1×83+0×82+2×81+3×80=51210+1610+310=(531)10。即八進制數(shù)1023的數(shù)值等于十進制數(shù)531的數(shù)值。R進制數(shù)轉(zhuǎn)換為十進制數(shù)

14小數(shù)的進制轉(zhuǎn)換算法與整數(shù)的轉(zhuǎn)換算法基本相同。將基數(shù)為R的小數(shù)轉(zhuǎn)換為十進制,只要將各個數(shù)位數(shù)與相應位權(quán)的乘積相累加,就可以得到相對應的十進制數(shù)。當從R進制轉(zhuǎn)換到十進制時,可以把小數(shù)點作為起點,分別向左右兩邊進行,即對其整數(shù)部分和小數(shù)部分分別轉(zhuǎn)換。寫Python程序時,可以利用一個Python自帶的字符函數(shù)partition()來找出小數(shù)點前面的字串和小數(shù)點后面的字串。例如:輸入一個二進制小數(shù),并將其分解為整數(shù)部分字符串和小數(shù)部分字符串的實際操作結(jié)果為:>>>bin=”1101.01”>>>(x,t,y)=bin.partition(‘.’)#結(jié)果是x=’1101’,t=’.’,y=’01’十進制數(shù)轉(zhuǎn)換為二進制數(shù)

15將十進制數(shù)轉(zhuǎn)換為二進制數(shù)就是要把這個數(shù)分解為若干二進制位權(quán)的和,十進制數(shù)的大小一定處于兩個二進制位權(quán)之間。例如通過下表將十進制數(shù)437轉(zhuǎn)換為二進制數(shù):首先選擇不大于437的最大的位權(quán),即28=256。于是,437就分解為256+181兩個數(shù)和。然后再選擇不大于181的最大位權(quán),即27=128。于是,437就分解為256+128+53......以此類推,可得出437=256+128+32+16+4+1。查看表2.5的二進制位權(quán)值,得到437的二進制為1101101012。十進制值2561286432168421二進制位權(quán)282726252423222120B110110101十進制數(shù)轉(zhuǎn)換為二進制數(shù)

16計算機不用查表的方法,用算法把十進制數(shù)轉(zhuǎn)換為二進制數(shù)。基本思想是先求出轉(zhuǎn)換后二進制數(shù)的最低位,然后依次算出高位。輸入一個十進制數(shù)x,輸出x的二進制數(shù)。其算法步驟如下:將x除以2;記錄所得的余數(shù)r(必然是0或1);用得到的商作為新的被除數(shù)x;重復步驟1到3,直到x為0。倒序輸出每次除法得到的余數(shù),所得的0、1字符串就是x的二進制數(shù)。十進制數(shù)轉(zhuǎn)換為二進制數(shù)-例子

17例如將十進制數(shù)19轉(zhuǎn)換為二進制數(shù)的步驟為:19/2=9余1,代表二進制的最低位是1;以此類推,9/2=4余14/2=2余02/2=1余01/2=0余1按逆序輸出的結(jié)果是1910=100112。程序示例-十進制數(shù)轉(zhuǎn)換為二進制數(shù)

18用while循環(huán)實現(xiàn)算法的第1到第4步,只要商不為0,就繼續(xù)循環(huán)。用變量r=x%2計算x被2除所得的余數(shù)。用運算x=x//2獲得x被2整除所得的商。用運算Rs=[r]+Rs獲得一個列表結(jié)構(gòu)(list)Rs,并把余數(shù)r加入列表的頭部。第9~10行的“for”循環(huán)是從最高位到最低位依次輸出結(jié)果。#<程序2.3:整數(shù)的10-to-2進制轉(zhuǎn)換>x=int(input("Pleaseenteradecimalnumber:"))r=0;Rs=[];while(x!=0): r=x%2 x=x//2 Rs=[r]+Rsforiinrange(0,len(Rs)):print(Rs[i],end='‘)程序示例-列表(List)的涵義

19列表是一組按順序排列的元素的集合。和字符串一樣,Python的列表也通過索引(index)引用其中的元素。從列表的最左端開始,依次是L[0],L[1],L[2]......??梢园蚜斜硐胂蟪梢淮错樞蚓幪柕暮凶釉谇懊媸M制到二進制數(shù)的轉(zhuǎn)換程序中,Rs=[r]+Rs這個運算把[r]作為一個列表元素加入列表Rs的頭部。例如對于列表Rs=[1,1,1],執(zhí)行運算Rs=[0]+Rs后,Rs的內(nèi)容就變成了[0,1,1,1]。0122090501234567L程序示例-用遞歸把十進制數(shù)轉(zhuǎn)換為二進制數(shù)

20遞歸方式的基本概念就是問題的結(jié)果是由小問題的結(jié)果構(gòu)建而成的。不管輸入給函數(shù)的數(shù)(叫做參數(shù))是什么,算法都一樣。定義函數(shù)convert(x),輸入一個十進制整數(shù)x,輸出x對應的二進制整數(shù)。首先判斷這個十進制數(shù)是否小于2,小于2可以直接返回結(jié)果。否則就用r=x%2計算此時x除以2的余數(shù),并計算x除以2的商。然后再次調(diào)用函數(shù)convert(x),對新的x作同樣的計算,并記錄此次的余數(shù)。#<程序2.4:整數(shù)的10-to-2進制轉(zhuǎn)換-遞歸>defconvert(x):ifx<2:return([x])r=x%2;return(convert(x//2)+[r])num=int(input("Pleaseenteradecimalnumber:"))Rs=convert(num)foriinrange(0,len(Rs)):print(Rs[i],end=''十進制數(shù)轉(zhuǎn)換為R進制數(shù)

21十進制整數(shù)x轉(zhuǎn)換為R進制整數(shù)的算法稱為“除R取余法”,其算法如下:輸入:十進制整數(shù)x;輸出:x的R進制整數(shù)。將x除以R;記錄所得余數(shù)r(其中,0≤r<R-1);用得到的商作為新的被除數(shù)x;重復步驟1到3,直到x為0。倒序輸出每次除法得到的余數(shù),就是要求的R進制數(shù)。十進制數(shù)轉(zhuǎn)換為R進制數(shù)

22把十進制小數(shù)轉(zhuǎn)換為R進制小數(shù)的方法和整數(shù)的進制轉(zhuǎn)換方法類似,稱為“乘R取整法”,其算法如下:輸入:十進制小數(shù)x;輸出:x的R進制小數(shù)。將x除以R;R乘以x的小數(shù)部分;取乘積的整數(shù)部分作為轉(zhuǎn)換后R進制數(shù)的小數(shù)點后第1位;乘積的小數(shù)部分作為新的x;重復步驟1-3,直到乘積為0,或已得到足夠精度的小數(shù)為止。輸出所得到的R進制小數(shù)。二、八、十六進制的巧妙轉(zhuǎn)換

2323=81,24=161

八進制數(shù)的一位可以表示為二進制數(shù)的三位,十六進制數(shù)的一位可以表示為二進制數(shù)的四位?!叭灰徊⒎ā保阂匀粸橐粋€單元劃分二進制數(shù),每個單元可以獨立地轉(zhuǎn)換為一個八進制數(shù)位。“四位一并法”:以四位為一個單元劃分二進制數(shù),每個單元可以獨立地轉(zhuǎn)換為一個十六進制數(shù)位。在轉(zhuǎn)換時要注意二進制數(shù)的高位0位數(shù)不足時需要補足。

例如:11000102=0011000102=1428,注意最左邊單元的位數(shù)不足,前端補了2個0。小結(jié)

24R進制數(shù)轉(zhuǎn)換為十進制數(shù)時,將各位數(shù)與它的位權(quán)乘積相累加,即一個二進制數(shù)anan-1...a1a0在十進制中的值A(chǔ)=an×Rn+an-1×Rn-1+…+a1×R1+a0×R0。十進制整數(shù)轉(zhuǎn)換成R進制整數(shù):可用十進制整數(shù)連續(xù)地除以R,每次除法獲得的余數(shù)即為相應R進制數(shù)一位,最后按逆序輸出結(jié)果。此方法稱為“除R取余法”。十進制小數(shù)轉(zhuǎn)換成R進制小數(shù):可用十進制的小數(shù)連續(xù)地乘以R,用得到的整數(shù)部分組成R進制的小數(shù),最后按順序輸出結(jié)果。此法稱為“乘R取整法”。對于二進制數(shù)和八進制數(shù)、十六進制數(shù)之間的轉(zhuǎn)換,有簡便快速的“三位一并法”和“四位一并法”。第3節(jié)計算機中的二進制四則運算

25中央處理器(CPU)及其位數(shù)無符號整數(shù)與加法乘法與除法帶符號整數(shù)的減法小數(shù)—浮點數(shù)中央處理器及其位數(shù)

26中央處理器(CentralProcessingUnit,即CPU)是進行各種運算的硬件,是一個非常小的集成電路芯片,通過引腳(pin)與外部連接并交換數(shù)據(jù)。每一根引腳一次只能傳輸0或1的一個比特。引腳的數(shù)量就是CPU的位數(shù),32位CPU就有32根數(shù)據(jù)引腳。CPU一次只能夠處理有限數(shù)位的二進制數(shù)?,F(xiàn)在的計算機一般能一次能處理32個或64個比特的數(shù)據(jù),計算機能直接處理的最大的二進制整數(shù)是232或264。如何表示正整數(shù)與負整數(shù)?計算機通常把整數(shù)分為兩類:無符號整數(shù)(unsignedinteger),表示的是非負整數(shù),n位計算機能表示[0,2n-1]范圍內(nèi)的所有整數(shù);帶符號整數(shù)(signedinteger),可以表示正整數(shù)、負整數(shù)和0,因此需要占用一個比特位來表示整數(shù)的正負符號,所能表示的正整數(shù)范圍就會變小。中央處理器及其位數(shù)

27無符號整數(shù)與加法

28對于無符號整數(shù),n個比特所能表示的最大數(shù)是2n。用8個比特位表示的最大整數(shù)是28。8個比特能夠表示[0,255]之間的所有二進制整數(shù)。000000002表示0,000000012表示1,111111112表示255。在二進制加法中遵循“逢二進位”的法則,即兩數(shù)對應的位相加與前一位的進位的和,大于1則產(chǎn)生進位,把小于等于1的部分記為兩數(shù)相加后該位的值。無符號整數(shù)與加法—溢出

29溢出(overflow):無符號整數(shù)加法的一種異常情況,即兩個整數(shù)相加的和的位數(shù)大于這兩個數(shù)的位數(shù)。例如對于只能處理8位整數(shù)的計算機而言,這個二進制加法的和造成了溢出:從算術(shù)上看,“137+136=17”的結(jié)果顯然是錯誤的。而在計算機中產(chǎn)生這類錯誤的原因是兩數(shù)相加的和超過了CPU所能處理的最大無符號整數(shù)28,即255。溢出發(fā)生時,CPU會報錯。舍棄實際結(jié)果(錯誤)乘法與除法

30二進制的乘法和除法的運算規(guī)則和十進制的運算規(guī)則是一樣的。二進制乘法是由基本的二進制加法和移位操作所完成的當兩個二進制數(shù)的位數(shù)之和大于或等于計算機所能處理的位數(shù)n時,乘法的結(jié)果很可能超過n位,也就是出現(xiàn)溢出。絕大部分計算機系統(tǒng)都有處理溢出的機制,這里不再作深入討論。乘法與除法

31二進制除法是由基本的二進制減法和移位操作完成從最高位開始,在被除數(shù)中取和除數(shù)同樣多的位數(shù),所得數(shù)值減去除數(shù),直至所得的余數(shù)小于除數(shù),這個余數(shù)和被除數(shù)中的剩余位數(shù)拼接成新的數(shù),取其中和除數(shù)同樣多的位數(shù),并減去除數(shù)......重復這個過程直到被除數(shù)的最后一位。帶符號數(shù)的減法

32減法其實可以看作對負數(shù)的加法

如何在計算機的世界里表示負數(shù)?在帶符號數(shù)的運算中,計算機用1個比特表示該整數(shù)的符號,把一半的數(shù)定義為負數(shù)。十進制數(shù)無符號整數(shù)帶符號整數(shù)對應方式(1)帶符號整數(shù)對應方式(2)25511111111-128-125411111110-127-2…………12810000000-1-1281270111111112712712601111110126126…………0000000000000000000000000帶符號數(shù)的減法-對應方式(1)

33將上面的式子轉(zhuǎn)換成十進制后,竟然出現(xiàn)了-1+1=-2的結(jié)果,同樣地:出現(xiàn)了-127+1=-128的結(jié)果。顯然采取對應方式(1)來表示負數(shù)會造成計算錯誤。帶符號數(shù)的減法-對應方式(2)

34上面加法的最終結(jié)果產(chǎn)生溢出,最高位的進位自然丟失,如果將結(jié)果轉(zhuǎn)換回十進制數(shù)即為0,結(jié)果正確。驗證-1+2=1的二進制加法,結(jié)果也正確。計算機用第(2)種對應方式表示負數(shù),也就是所謂的補碼(2'scomplement)帶符號數(shù)的減法-補碼與真值

35使用補碼的情況下,在一個n位的CPU中,對于任意一個正整數(shù)x,

它的負數(shù)-x所對應的無符號十進制整數(shù)是2n-x。在補碼表示中,一個帶符號整數(shù)的二進制數(shù)值被稱為“真值”真值的最高位通常用來表示這個帶符號整數(shù)的符號:0表示是正數(shù),1表示負數(shù)。十進制數(shù)補碼真值255-111111111254-211111110………128-128100000001271270111111112612601111110………00000000000000000負數(shù)-x的補碼通過正整數(shù)x的反碼加1得到。

例如在8位的CPU中,7轉(zhuǎn)變?yōu)?7是000001112111110002,然后加1,得到-7=111110012。由-7的帶符號二進制負數(shù)計算獲得正整數(shù)7的過程是:111110012000001102,再加1,則得到000001112=7。反碼(1‘scomplement)按位取反,原來是0的位變?yōu)?,原來是1的位變?yōu)?帶符號數(shù)的減法-補碼與反碼

360110按位取反按位取反按位取反帶符號數(shù)的減法-補碼

37

回顧:

用負數(shù)的加法表示帶符號整數(shù)的減法用補碼表示帶符號整數(shù),包括負整數(shù)、正整數(shù)和0一個帶符號整數(shù)的二進制數(shù)值被稱為“真值”一個二進制數(shù)值的反碼就是對它“按位取反”十進制整數(shù)-x的補碼=十進制整數(shù)x的真值的反碼+1問題:

補碼表示的帶符號數(shù)如何做加法?是否存在異常情況,例如溢出?

帶符號數(shù)的減法-補碼的加法

38

在用補碼方式表示n位帶符號整數(shù)時,最大數(shù)是2n-1-1,最小數(shù)是-2n-1由于在計算機中存在位數(shù)的限制,整數(shù)溢出的問題是不可避免的。例1:

因為120+30=150>127,超過了8位補碼能夠表示的最大值,導致溢出。例2:由于最高位(第8位)的進位丟失,使得(-120)+(-30)的結(jié)果竟然成為正數(shù)106。超出了8位補碼能夠表示的最小值,因而導致溢出。帶符號數(shù)的減法-補碼的加法

39

在使用n位補碼的計算機中,帶符號數(shù)的加法會產(chǎn)生以下3種情況:正溢出(Positiveoverflow):兩個正數(shù)x和y相加,如果結(jié)果的最高位是1,就代表溢出。例如120+30=011110002+000111102=100101102,第八位為1,說明出現(xiàn)正溢出。不產(chǎn)生溢出。即一正一負相加的情況。負溢出(Negativeoverflow):兩個負數(shù)相加,最高位(第n位)為0則代表溢出。例如,(-120)+(-30)=100010002+111000102=1011010102,第8位為0,說明出現(xiàn)負溢出。小數(shù)—浮點數(shù)

40在計算機中整數(shù)以外的其他數(shù)(帶小數(shù)的數(shù))被稱為浮點數(shù)(Floatingnumber)浮點運算的規(guī)則和整數(shù)的運算規(guī)則相同計算機使用類似科學記數(shù)的方法表示浮點數(shù),包括指數(shù)e和尾數(shù)m以及帶符號數(shù)的符號位s二進制浮點數(shù)1.011×2010在計算機中存為:現(xiàn)代計算機常用單精度浮點數(shù)(32位)和雙精度(64位)浮點數(shù)。浮點運算比整數(shù)運算更為復雜,世界上的超級電腦都是按照浮點運算性能排名的。小數(shù)—浮點數(shù)

41大家在做浮點數(shù)運算時,有時會遇到精度丟失的問題,即結(jié)果與預期有偏差。為什么會出現(xiàn)這種狀況?

真正的原因要從計算機保存浮點數(shù)的原理說起。計算機是以二進制的方式存儲數(shù)字的。在前面的學習中,我們學會了如何將十進制小數(shù)轉(zhuǎn)換為二進制。但是在使用中我們會發(fā)現(xiàn),有些十進制的小數(shù)我們無法用二進制小數(shù)準確表示。比如十進制小數(shù)0.6,如果我們不限制位數(shù),小數(shù)點后的位數(shù)將會是無窮的。所以我們只能通過不斷增加二進制的長度來提高精確度。工業(yè)界為了有統(tǒng)一的標準,這就出現(xiàn)了IEEE二進制浮點數(shù)算術(shù)標準(IEEE754)。在此標準下,一個浮點數(shù)最多是用64位來存放,所以會有精確度的損失。小數(shù)—浮點數(shù)

42根據(jù)IEEE754的規(guī)定,每個二進制浮點數(shù)都有以下幾個部分組成:符號位s,指數(shù)e和尾數(shù)m。一個浮點數(shù)a表示為±m(xù)×2e,其中,符號位s=0如果a為正數(shù),否則是1。尾數(shù)m是表示形如1.ddd...ddd的數(shù)(每一位d是0或1),我們不需要存儲m最前面的1(小數(shù)點前一定是1)和小數(shù)點,所以尾數(shù)m部分只存儲小數(shù)點后的那些d值,而精準度則是取決于能存儲多少位d值。注意,指數(shù)e可以為正也可以為負數(shù),IEEE754不用補碼方式,它用其特殊方式來表示正負指數(shù)值。以1.0112×22為例,這是個正數(shù),所以符號位s是0,尾數(shù)m存儲011部分,指數(shù)e則是2。小數(shù)—浮點數(shù)

43現(xiàn)代計算機中通常用32位或64位存放浮點數(shù),分別叫作單精度和雙精度浮點數(shù)。IEEE754的單精度浮點數(shù)共32位,其中23位表示尾數(shù),8位表示指數(shù),1位表示符號數(shù)。這里要特別說明一下,IEEE754中規(guī)定,指數(shù)部分的正負是通過中間數(shù)的偏移來表示的。單精度浮點數(shù)的指數(shù)部分是由8位組成,那么它的中間數(shù)的真值是127(01111111),也就是真值127代表指數(shù)0,真值126(01111110)代表指數(shù)-1,真值128(10000000)代表指數(shù)1,真值129(10000001)代表指數(shù)2,以此類推。例如二進制浮點數(shù)1.011×22以單精度的形式在計算機中的存儲如下圖所示。小數(shù)—浮點數(shù)

44注意,二進制浮點數(shù)整數(shù)部分的1是默認不存儲的,而是只存放尾數(shù)的小數(shù)部分。如果小數(shù)部分不足23位,則在不足的位補0。因為101.1是正數(shù),所以符號位是0,101.1的指數(shù)部分是2,表示為01111111+2,即10000001。最后的尾數(shù)部分填入小數(shù)部分011,不足23位的地方補0即可。如果指數(shù)是負數(shù)時,例如二進制浮點數(shù)1.011×2-2,同樣是單精度浮點數(shù)時,它的指數(shù)部分就可以表示為01111111-2,即01111101。IEEE754同樣也為雙精度浮點數(shù)制定了標準,雙精度浮點數(shù)共64位。和單精度浮點數(shù)一樣,由符號位,指數(shù)和尾數(shù)三部分組成。不同的是尾數(shù)部分由52位組成,指數(shù)e變成了11位,相應的中間數(shù)也變?yōu)榱?1111111111。本書介紹了浮點數(shù)的基本表示法,有些IEEE754特殊數(shù)的表示法則不作介紹。浮點數(shù)的運算也有其特別之處,這部分內(nèi)容將在計算機系統(tǒng)的相關(guān)課程中討論,本書不深入講解。顯然,浮點運算比整數(shù)運算更為復雜。一般較好的計算機都有專門的浮點運算單元。浮點運算通常是對計算機性能的一大考驗。世界上的超級計算機都是按照浮點運算性能排名的。小數(shù)—浮點數(shù)

45為什么IEEE754的指數(shù)部分不采用補碼,而用中間數(shù)的偏移來表示正負?這是為了方便兩個指數(shù)做大小比較和計算兩指數(shù)的差距。以二個浮點數(shù)做加法或比較大小為例,首先要比較指數(shù)大小,更正指數(shù)值使得二個小數(shù)點對齊,用IEEE754的指數(shù)存放法,二指數(shù)的差距可以簡單地用他們的真值算出來,例如,兩個浮點數(shù)的指數(shù)為3和-1,那么IEEE754會分別存放真值127+3=130和127-1=126。從真值中就可以辨別130大于126,并且他們的差距是130–126=4。這使得浮點運算的硬件比較容易實現(xiàn)。小結(jié)

46無符號整數(shù)只能表示非負整數(shù),帶符號整數(shù)可以表示正整數(shù)、零和負整數(shù)帶符號整數(shù)的補碼編碼方法(真值、反碼)對于n位計算機,無符號整數(shù)能表示的最大值是2n-1,最小值是0;而帶符號整數(shù)的補碼所能表示的最大值是2n-1-1,最小值是-2n-1。四則運算都可以用加法完成。一切都是加法。在計算機中,我們只需要一種實現(xiàn)加法的硬件就能完成所有的四則運算。在無符號整數(shù)的加法中,只可能產(chǎn)生一種溢出,可以通過結(jié)果s與加數(shù)x的關(guān)系判斷是否溢出。在帶符號整數(shù)的加法中,可能出現(xiàn)正溢出和負溢出兩種情況,正溢出是指兩個正整數(shù)相加的和成為負數(shù),負溢出是指兩個負整數(shù)相加的和成為正數(shù)。計算機通常把浮點數(shù)分為符號位、指數(shù)、尾數(shù)3個部分存放第4節(jié)一切都是邏輯(Logic)

47什么是邏輯運算電路實現(xiàn)邏輯用邏輯做加法加法與控制語句什么是邏輯運算

48在計算機中沒有真正做加法運算的電路,因為電子元件不能“計算”結(jié)果計算機里面的電子元件就像是一道道閘門,門的“開”與“關(guān)”對應邏輯的“0”與“1”兩種狀態(tài),決定了電路的導通或斷開基本運算是由0與1的邏輯運算衍生而來,這也就是計算機的電子電路能夠?qū)崿F(xiàn)二進制計算的原因什么是邏輯運算-邏輯變量與運算符

49邏輯運算是對邏輯變量和邏輯運算符號的組合序列所作的邏輯推理。邏輯運算的變量只有兩個,它們代表兩種對立的邏輯狀態(tài)。真—假、是—否、有—無

1—0邏輯運算的基本運算:與(AND):代表邏輯運算的乘法,運算符號是“∧”或(OR):代表邏輯運算的加法,運算符號是“∨”非(NOT):代表邏輯上的否定,運算符號是“﹁”“與”和“或”都操作兩個邏輯變量,而“非”只操作一個邏輯變量邏輯變量A的“非”是在A上面加一短橫表示,即?。钭鳌癆bar”)邏輯運算的結(jié)果也只能是0或1,代表邏輯推理上的“真”或“假”。什么是邏輯運算-真值表

50為了運算方便,把邏輯變量和邏輯運算的結(jié)果列在一張表里這張表稱為真值表(Truthtable)ABāANDOR00100011011000111011A為1并且B為1時,AANDB的運算結(jié)果才為1A或B中的任何一個為1,AORB的結(jié)果即為1A和B都為0時,AORB的運算結(jié)果才為0A或B中的任何一個為0,AANDB的結(jié)果即為0什么是邏輯運算-運算優(yōu)先級

51

在邏輯運算中,“非”運算的優(yōu)先級最高,“與”、“或”運算的優(yōu)先級相同。例如計算邏輯式﹁A∨B時,首先計算﹁A,然后再進行“或”運算,相當于計算(﹁A)∨B。而不是先算A∨B,再做非運算。邏輯式(﹁A)∨B和邏輯式﹁(A∨B)的含義完全不同。如果用自然語言表述,我們把前一個式子念作“非A和B的或”,把后一個式子念作“A或B的非”。有了基本邏輯運算的真值表和運算規(guī)則,就可以正確地完成邏輯運算。電路實現(xiàn)邏輯

52計算機電路中用晶體管實現(xiàn)邏輯。晶體管是以半導體材料為基礎(chǔ)的元件,例如各種半導體材料制成的二極管、三極管、場效應管、可控硅等?,F(xiàn)在計算機芯片制造者已經(jīng)可以用大規(guī)模生產(chǎn)的方式在幾個平方毫米的半導體晶片上實現(xiàn)數(shù)百萬個晶體管。晶體管發(fā)明者JohnBardeen,WilliamShockley,WalterBrattain幾種不同封裝大小的晶體管電路實現(xiàn)邏輯-晶體管

53我們可以通過控制晶體管的電源來控制它們開或關(guān)的狀態(tài)

圖示為一個三極管稱為三極管是因為它有D、S和G三個引腳D端代表高電壓,通常都是5VG端代表輸入信號。晶體管就像一個開關(guān)一樣:當G輸入是高電壓的時候,代表輸入邏輯G=1,晶體管導通;當G輸入是低電壓的時候,代表輸入邏輯G=0,晶體管就不通。S端接地,也就是0V電路實現(xiàn)邏輯-非門

54輸入電壓經(jīng)過“非門”后,輸出的結(jié)果正好與輸入相反。比如輸入電壓1,圖里的晶體管導通,輸出電壓的線路就接地了,只好輸出0;而輸入電壓0,圖里的晶體管斷開,輸出電壓的線路就變成了高電壓,只好輸出1。電路實現(xiàn)邏輯-與門

55把兩個晶體管的輸入電壓A和B串聯(lián)起來可以實現(xiàn)與門。只有輸入電壓A和B同時為1時,這條電路才會導通,最后經(jīng)過非門得到的輸出結(jié)果是1。非門的電路表示符號是圖中帶小圓點的三角形。電路實現(xiàn)邏輯-或門

56把兩個晶體管的輸入電壓A和B并聯(lián)起來可以實現(xiàn)或門。只有當輸入電壓A和B同時為0時,這條電路才會成為斷開的狀態(tài),最后經(jīng)過非門得到的輸出電壓是0;在A或B中的任意個電極輸入電壓1,這條路都會導通,最終經(jīng)過非門的輸出結(jié)果也就會變成1。用邏輯做加法

57二進制數(shù)的加法在計算機里是由每一個比特位的加法組成的而每一位的的加法都需要3個輸入,并產(chǎn)生2個輸出3個輸入分別是兩個相加位和一個由相鄰低位產(chǎn)生的進位2個輸出分別是一個相加得到的二進制數(shù)位和一個進位半加器(Halfadder)

:兩個輸入,沒有進位C作為輸入全加器(Fulladder)

:三個輸入用邏輯做加法-半加器

58半加器的輸入是兩個1位的二進制數(shù)A和B,它們的值是0或1;經(jīng)過加法器的運算之后,給出兩個1位的輸出,一個是加法所產(chǎn)生的低位,稱為“和”(sum);另一個是加法所產(chǎn)生的進位(carry)。A=0,B=0,Sum=0,Carry=0,即和為0且沒有進位;A=0,B=1,Sum=1,Carry=0,即和為1且沒有進位;A=1,B=0,Sum=1,Carry=0,即和為1且沒有進位;A=1,B=1,Sum=0,Carry=1,即和為0且進位為1;用邏輯做加法-半加器

59A=0,B=0,Sum=0,Carry=0A=0,B=1,Sum=1,Carry=0A=1,B=0,Sum=1,Carry=0A=1,B=1,Sum=0,Carry=1ABSumCarry0000011010101101半加器的真值表用邏輯做加法-半加器

60觀察真值表發(fā)現(xiàn):Carry:只有當輸入A和B同時為1時,Carry的值才可能為1

Carry=A∧BSum:Sum為1的情況在真值表里出現(xiàn)了兩次1)A為0且B為1時,Sum為1,這個邏輯關(guān)系可以表示為A∧﹁B=1;2)A為1,且B為0時,Sum為1,這個邏輯關(guān)系可以表示為﹁A∧B=1。這兩種情況中只要有一種情況成立,Sum即為1。

Sum=(A∧﹁B)∨(﹁A∧B)。ABSumCarry0000011010101101半加器的真值表:用邏輯做加法-半加器

61為了方便起見,我們常在寫邏輯算式時省略邏輯與的符號,并且用“+”和“bar”代替邏輯或和相應變量的非運算。例如:Carry=A∧B,Sum=(A∧﹁B)∨(﹁A∧B)改寫為Carry=AB,Sum=。我們可以根據(jù)這種邏輯運算的符號畫出圖示的電路設計圖:用邏輯做加法-全加器

62實現(xiàn)多位加法需要全加器,只要在半加器的基礎(chǔ)上做一個小小改進,就可以得到全加器。半加器的沒有進位輸入,而全加器需要輸入低位的進位,全加器如下圖所示:3個輸入:A和B是兩個加數(shù),Ci是從下一位獲得的進位。兩個輸出:給上一位的進位Co,以及兩數(shù)相加的和在該位的值Sum。用邏輯做加法-全加器

63全加器的真值表:ABCiSumCo0000000110010100110110010101011100111111觀察真值表發(fā)現(xiàn):Carry:只要A、B、Ci中有任意兩個輸入的值是1,不管余下的一個輸入值是多少,Co一定會是1。

Co=AB+ACi+BCi

Sum:有4種情況會使得Sum的取值為1,這四種情況中只要有一種情況成立,Sum即為1。

Sum=ABCi+ABCi+ABCi+ABCi。程序示例-全加器

64程序直接使用Python中的邏輯運算符表達了全加器的邏輯算式。程序的三個輸入是加數(shù)a、被加數(shù)b,和進位c;兩個輸出分別是Sum和向左鄰位的進位Carry。程序中的“and”是邏輯與的運算符,“or”是邏輯或的運算符,“not”是邏輯非的運算符。反斜杠“\”表示一個長語句在下一行的繼續(xù),這是Python語言為了便于大家使用而提供的一個語句連接符號。#<程序:全加器>defFA(a,b,c):#FulladderCarry=(aandb)or(bandc) or(aandc)Sum=(aandbandc)or(aand (notb)and(notc))\ or((nota)andband(notc))\ or((nota)and(notb)andc)returnCarry,Sum用邏輯做加法-漣波進位加法器

65漣波進位加法器(Ripple-carryadder):把多個1位全加器串聯(lián)起來,組成一個多位的加法器。串聯(lián)方式中,每個全加器計算一位加法,只需要簡單地將一個全加器輸出的進位連接到與其左鄰的全加器的輸入進位。如果要計算第i位的值,必須先計算出第0到i-1位的所有加法。最右端的全加器執(zhí)行最低位的加法,它進位輸入C0通常置為常量0。也可以直接用一個半加器執(zhí)行最低位的加法。程序示例-程序:完整的加法器

66兩個輸入x和y,分別代表被加數(shù)和加數(shù);有兩個輸出,分別是進位Carry和存放加法結(jié)果的列表L。兩個while循環(huán)在位數(shù)較少的數(shù)前面補0,直到兩個數(shù)的位數(shù)相同。for循環(huán)從二進制數(shù)的最低位開始,調(diào)用全加器函數(shù)FA(x[i],y[i],Carry)對輸入的每一位依次做加法。用Python實現(xiàn)的加法器利用了Python語言所定義的列表的性質(zhì),沒有位數(shù)限制。如果換成用硬件電路設計的加法器,就會受到各種硬件資源的制約。1.#<程序:完整的加法器CarryRippleadder>2.defadd(x,y):3.whilelen(x)<len(y):x=[False]+x4.whilelen(y)<len(x):y=[False]+y5.L=[];Carry=False6.foriinrange(len(x)-1,-1,-1):7.Carry,Sum=FA(x[i],y[i],Carry)8.L=L+[Sum]9.return(Carry,L)用邏輯做加法-乘法器

67前面說過,乘法可以用加法和移位操作實現(xiàn),那么請看使用漣波進位加法器組成的乘法器:程序示例-程序:乘法器

68兩個輸入x和y,分別代表被加數(shù)和程序for循環(huán)所產(chǎn)生的乘法過程的部分和存放在列表S中。在每一次循環(huán)中,判斷y的當前位是否為1,為1就在當前結(jié)果S上加被乘數(shù)x,即“C,S=add(S,x)”。如果S和x的加法產(chǎn)生進位,就將其加入列表S,即“ifC==True:S=[C]+S”。每完成一位乘法,加法器就需要把被乘數(shù)x向左移1位。這個程序把左移被加數(shù)x的方法在x的后面增加一個元素False,即“x=x+[False]”。。1.#<程序:乘法器>2.defmultiplier(x,y):#求x*y3.S=[];4.foriinrange(len(y)-1,-1,-1):5.ify[i]==True6.C,S=add(S,x)#加法7.ifC==True:S=[C]+S8.x=x+[False] #移位9.return(S)加法與控制語句

69對于計算機而言,所有的控制語句對控制條件的判斷都可以轉(zhuǎn)變成加法,即變成加法器上的最基本的操作。ifbin[i]==str(1):weight=2**(len(bin)-i-1)dec=dec+weight;可以讓上面程序里的if語句判斷條件變成是計算機可以執(zhí)行的減法運算:bin[i]-str(1)如果它結(jié)果為0,則if語句的判斷條件成立,因此可以接著執(zhí)行后續(xù)語句;否則,如果判斷條件不成立,程序?qū)⒅苯犹D(zhuǎn)到print(dec)語句。用加法電路可以實現(xiàn)所有的運算,包括減法運算,所以可以用加法電路實現(xiàn)程序的控制語句。小結(jié)

70我們體認到計算機世界里的0與1不僅僅組成了二進制數(shù),而且和邏輯中的“真”與“假”建立了對應關(guān)系。這種對應關(guān)系讓計算機有能力通過邏輯運算實現(xiàn)最基本的加法運算,進而實現(xiàn)所有的數(shù)值運算,以及控制語句的判斷條件。構(gòu)成計算機的電子電路所能做“計算”其實都是邏輯運算。0與1把其他所有進制的數(shù)轉(zhuǎn)換為計算機中的電子電路所能表達和運算的二進制數(shù)。也為我們打通了數(shù)值計算和邏輯運算之間的界限,使我們看到二者通融的本質(zhì)。在計算機中,一切都是邏輯,一切都歸功于神奇的0與1!第5節(jié)計算機中的存儲

71數(shù)據(jù)的存儲形式存儲設備數(shù)據(jù)的存儲形式

72計算機用二進制數(shù)的組合來表達所有需要保持的信息,這些二進制數(shù)的組合按照一定的規(guī)則存放就形成了計算機里的數(shù)據(jù)。二進制數(shù)的數(shù)值0或1的存儲方式跟隨著物理介質(zhì)的特性不同而不同,基本是利用物理材料的電信號、磁信號之類的狀態(tài)來存儲0或1。這些載體就稱為存儲介質(zhì)。存儲介質(zhì)和輔助數(shù)據(jù)存儲和數(shù)據(jù)讀寫的電路、設備等組合在一起,構(gòu)成了存儲設備,例如我們常用的內(nèi)存、磁盤、U盤等。數(shù)據(jù)的存儲形式

73在計算機內(nèi)部,各種信息都是以二進制編碼的形式存儲的。在二進制編碼中,指定不同數(shù)量的0或1形成的不同的組合表示不同的意義。編碼往往用到一大串0或1,必須要按照一定規(guī)則對這些信息進行分割和識別才能獲得有用的信息。計算機普通把單位信息分成以下三種:位(或稱為“比特”,bit):一個1或一個0即一個位。字節(jié)(Byte):一個字節(jié)由8位二進制數(shù)組成(1Byte=8bit)。字(Word):字是字節(jié)的組合,CPU可以用“字”為單位來讀寫數(shù)據(jù)。大部分CPU的字長是32位(4個字節(jié))或64位(8個字節(jié))。數(shù)據(jù)的存儲形式

74字節(jié)是信息存儲中常用的基本單位。計算機的存儲器(包括內(nèi)存與外存)通常也是以多少字節(jié)來表示它的容量。常用的單位有:KB(Kilobyte):K代表210

,1KB=210B=1024B;MB(Megabyte):M代表220,1MB=1024KB;GB(Gigabyte):G代表230

,1GB=1024MB;TB(Terabyte):T代表240

,1TB=1024GB;PB(Petabyte):P代表250

,1PB=1024TB;EB(Exabyte)

:E代表260

,1EB=1024PB。這些符號在不同場合有不統(tǒng)一的定義。通常在談容量時用的是二進制的一套定義方法;在談論計算機性能時常用的是單位制;而談速度的時用的是十進制的一套定義。例如網(wǎng)絡傳輸就是用的十進制。數(shù)據(jù)的存儲形式—符號的編碼方式

75ASCII碼:

美國信息交換標準碼,AmericanStandardCodeforInformationInterchange10個數(shù)、大小寫英文字母和專用字符等95種可打印字符和33個控制字符使用1個字節(jié)中的7位二進制數(shù)來表示一個字符,最多可表示128個字符Python函數(shù)ord()和chr()分別在字符和對應的ASCII碼數(shù)值之間進行轉(zhuǎn)換GBK字符集:即國家標準擴展字符集,指明了計算機中如何表示漢字。目前的GBK中用兩個字節(jié)代表一個漢字,所以GBK字符集最多表示216=65536個漢字,目前表示了21886個漢字。統(tǒng)一字符編碼Unicode:國際上普遍適用的統(tǒng)一字符編碼UnicodeUnicode只有一個字符集,字符有兩個字節(jié)的確定編碼,即UCS-2Unicode對于不同的計算機系統(tǒng)平臺有不同的實現(xiàn)方式,即常說的Unicode轉(zhuǎn)換格式(UnicodeTransformationFormat,簡稱為UTF),例如UTF-8、UTF-16LE等數(shù)據(jù)的存儲形式

76在計算機內(nèi)部,漢字編碼和字符編碼是共存的,而對不同的信息有不同的處理方式,那我們應該如何區(qū)分它們呢?方法之一就是ASCII碼所用字節(jié)最高位置為“0”,而對于雙字節(jié)的國標碼,將兩個字節(jié)的最高位都置成“1”,然后由軟件(或硬件)根據(jù)字節(jié)最高位來判斷。計算機里用二進制編碼的形式存儲各種信息,僅僅用0和1就可以表示世間所有的數(shù)、數(shù)學符號、漢字、英文、拉丁文和其他各種語言文字。然而,這些組織方式和編碼都是邏輯上的概念,都是形式上的組織方式,與真實計算機里存放數(shù)據(jù)的寄存器、緩存、內(nèi)存和磁盤等等看上去毫無關(guān)聯(lián)!所以接下來就要講解計算機是用物理設備表達與存儲0與1的相關(guān)內(nèi)容。存儲設備—存儲層次

77存儲設備:存放0和1組成的二進制信息的物理載體稱為存儲介質(zhì),存儲介質(zhì)加上配套電路等組件就組成了存儲設備?,F(xiàn)在計算機里常用的存儲設備以下幾類:寄存器(Register)高速緩存(Cache)內(nèi)存(Mainmemory)外存(Storage)圖示是目前計算機系統(tǒng)最基礎(chǔ)的存儲層次:速度越快價格越高容量越小,離CPU越近;速度越慢價格越低容量越大,離CPU越遠。存儲設備—寄存器

78寄存器(Register):處于CPU內(nèi)部,和算術(shù)邏輯單元(ArithmeticLogicUnit,ALU)直接相連寄存器讀寫數(shù)據(jù)的速度(訪問速度)是數(shù)百皮秒(1皮秒=10-12秒),非常接近ALU的計算速度。因為很昂貴,所以寄存器的容量極小,通常只有數(shù)百個字節(jié)的大小。普通運算時需要將數(shù)據(jù)先放到CPU中的寄存器里,然后ALU對寄存器的值做計算,再存回寄存器里。存儲設備—高速緩存

79高速緩存(Cache):通常是由靜態(tài)隨機存儲器(StaticRandomAccessMemory,SRAM)制成,它是一種較快速的存儲介質(zhì),而且不需要刷新電路即能保存它內(nèi)部存儲的數(shù)據(jù)。速度比寄存器慢,容量比寄存器大,比寄存器要便宜些。實際計算機里的Cache可以分作1到3級,通常1級Cache的訪問速度是1~2納秒(ns),容量是64KB。其后兩級的速度在5~20ns之間,容量在256KB~4MB之間。存儲設備—內(nèi)存

80內(nèi)存:又叫主存,內(nèi)存通常由動態(tài)隨機訪問存儲器(DynamicRandomAccessMemory,DRAM)制成它比SRAM要便宜許多,容量也要大得多。內(nèi)存的速度在50~100ns之間,現(xiàn)在常用的內(nèi)存容量都在幾百MB到數(shù)GB之間。有的高端計算機或者其他特殊用途的地方(例如大型數(shù)據(jù)庫)的內(nèi)存甚至會用到數(shù)十GB到數(shù)TB的DRAM。程序普通執(zhí)行時的信息,包括程序指令和很多用到的數(shù)據(jù)都存放在內(nèi)存中。存儲設備—外存

81外存:外存一般指比內(nèi)存速度更慢容量更大的存儲器外存的一個顯著特征是數(shù)據(jù)斷電后不丟失,而當前以上三種存儲在斷電后都會丟失數(shù)據(jù)。通常就是我們所說的硬盤。現(xiàn)在常用的外存有磁盤(Mageneticdisk)和固態(tài)硬盤(也叫SSD),比DRAM要便宜許多。外存的訪問速度可能是微秒級(比如Flashmemory)、毫秒級(磁盤),容量一般都是GB或TB級別。存儲設備—緩存的概念

82有2個單位叫做A和B(A可想成是CPU,B可想成是存儲單元或另一臺電腦等),A和B有段距離,而A要對存在B的數(shù)據(jù)塊X做1000次左右的計算。從A到B讀取數(shù)據(jù)要花1秒時間,而在A里面每次做計算僅花1微秒(相對秒級,微妙可以忽略不計)。有二種方案:方案一:每次計算A都從B中讀數(shù)據(jù),做1000次就要花1000秒以上。方案二:先把數(shù)據(jù)塊X讀取到A中“緩存”起來,然后在A在它的緩存內(nèi)做快速計算,算完后A將結(jié)果從緩存再存回B。這樣總共不過花近似2秒的時間罷了。方案二比方案一要快非常多。這就是現(xiàn)在計算系統(tǒng)所用的概念—充分利用靠近CPU的存儲層次作“緩存”。存儲設備—顯存

83顯存(Videomemory):全稱是顯示存儲器,專門用來存儲要顯示的圖像數(shù)據(jù)。圖像數(shù)據(jù)數(shù)量巨大,更新速度極快,如果用內(nèi)存來存放這些數(shù)據(jù)可能大幅降低系統(tǒng)性能。顯存的材料一般和內(nèi)存一樣,都是DRAM,大小也比較相近,低端的只有數(shù)百MB,中高端的配置都在GB級別。像素點(Pixel):即顯示器上顯示畫面的一個個很小的點,當畫面的分辨率是1024×768時,就代表有1024×768這么多的像素點。每個像素點都用4至64位的數(shù)據(jù)來控制它的亮度和色彩,各類色彩不過就是紅綠藍(RGB)三原色依照不同比率所組合而成的。存儲設備—顯存

84幀(frame):像素點在一個瞬間構(gòu)成一幅圖形畫面。畫面的連續(xù)變換就形成了人眼看到的動畫或視頻。

為了保持畫面流暢,要輸出和要處理的多幅幀的像素數(shù)據(jù)非常多,更新也非常頻繁,所以好的計算機往往都配置專門的顯存來保存這些像素的數(shù)據(jù),達到緩沖效果,再交由顯示圖像用的芯片和CPU進行處理和調(diào)配,最后把運算結(jié)果轉(zhuǎn)化為圖形輸出到顯示器上。幀率(Framerate):即每秒顯示的幀數(shù)(FPS,F(xiàn)ramepersecond),也叫做和畫面的流暢度是有關(guān)系的,高的幀率可以得到更流暢、更逼真的畫面。一般來說30fps就可以有流暢的畫面。而60fps就更為逼真和流暢了,但是高fps需要對顯卡的性能有更高的要求。存儲設備—用晶體管制成DRAM和SRAM

85DRAM和SRAM都是用許多晶體管組成的存儲結(jié)構(gòu),一個DRAM的存儲單元僅僅是由一個晶體管加上一個電容組合而成,表示一個bit。電容里存儲的電荷數(shù)量用來表示這個bit是0或1。由于電容會一直慢慢漏電,漏電到一定程度就無法保存這個存儲單元的信息。所以規(guī)定每隔一定時間就刷新一次DRAM,也就是給電容充電,所以它叫動態(tài)存儲單元。存儲設備—用晶體管制成DRAM和SRAM

86在高速緩存里,使用的是另一種更為復雜快速的存儲單元,也就是靜態(tài)存儲單元—SRAM。SRAM不需要充電,它用多達六個晶體管組成了一個循環(huán)的結(jié)構(gòu)。同樣是存儲一個bit,SRAM用6個晶體管

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論