




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二章數(shù)據(jù)的表示和運(yùn)算
數(shù)值數(shù)據(jù)的表示
非數(shù)值數(shù)據(jù)的表示
數(shù)據(jù)的存放
數(shù)據(jù)的運(yùn)算數(shù)據(jù)的表示和運(yùn)算主要教學(xué)目標(biāo)掌握計算機(jī)內(nèi)部各種數(shù)據(jù)的編碼表示及其運(yùn)算方法了解高級語言程序中的各種類型變量對應(yīng)的表示形式在高級語言程序中的變量、機(jī)器數(shù)和底層硬件(寄存器、加法器、ALU等)之間建立關(guān)聯(lián)綜合運(yùn)用所學(xué)知識,分析高級語言和機(jī)器級語言程序設(shè)計中遇到的各種與數(shù)據(jù)表示和運(yùn)算相關(guān)的問題,解釋相應(yīng)的執(zhí)行結(jié)果C語言參考網(wǎng)站:/c/linux-c-programming/數(shù)據(jù)的表示和運(yùn)算分以下五個部分介紹第一講:數(shù)值數(shù)據(jù)的表示定點(diǎn)數(shù)編碼、整數(shù)的表示、浮點(diǎn)數(shù)表示C語言程序的整數(shù)類型和浮點(diǎn)數(shù)類型第二講:非數(shù)值數(shù)據(jù)的表示、數(shù)據(jù)的存放方式邏輯值、西文字符、漢字字符數(shù)據(jù)寬度單位、大端/小端第三講:加法器和算術(shù)邏輯部件按位運(yùn)算\邏輯運(yùn)算\移位運(yùn)算\位擴(kuò)展和位截斷運(yùn)算無符號和帶符號整數(shù)的加減運(yùn)算、ALU第四講:定點(diǎn)數(shù)乘除運(yùn)算無符號和帶符號整數(shù)的乘除運(yùn)算變量與常數(shù)之間的乘除運(yùn)算第五講:浮點(diǎn)數(shù)加減乘除運(yùn)算從C程序的表達(dá)式出發(fā),用機(jī)器數(shù)在電路中的執(zhí)行來解釋表達(dá)式的執(zhí)行結(jié)果課程內(nèi)容概要/*---sum.c---*/intsum(inta[],unsignedlen){ int i,sum=0; for (i=0;i<=len–1;i++) sum+=a[i]; returnsum;}/*---main.c---*/intmain(){ int a[1]={100}; intsum;sum=sum(a,0);printf(“%d”,sum);}數(shù)據(jù)的表示數(shù)據(jù)的運(yùn)算如果程序處理的是圖像、視頻、聲音、文字等數(shù)據(jù),那么,(1)如何獲得這些數(shù)據(jù)?(2)如何表示這些數(shù)據(jù)?(3)如何處理這些數(shù)據(jù)?“轉(zhuǎn)換”的概念在數(shù)據(jù)表示中的反映具體實(shí)現(xiàn)抽象概括感覺媒體信息樹、鏈表等結(jié)構(gòu)化數(shù)據(jù)描述int,float,array,struct等類型指令指定寄存器或內(nèi)存中數(shù)據(jù)ALU中運(yùn)算或總線上傳輸?shù)臄?shù)據(jù)邏輯門位信息問題(應(yīng)用)算法程序(語言)指令集體系結(jié)構(gòu)(ISA)微體系結(jié)構(gòu)電路器件(晶體管)各類數(shù)據(jù)之間的轉(zhuǎn)換關(guān)系對連續(xù)信息采樣,以使信息離散化對離散樣本用0和1進(jìn)行編碼定點(diǎn)運(yùn)算指令浮點(diǎn)運(yùn)算指令邏輯、位操作或字符處理指令數(shù)值數(shù)據(jù)的表示數(shù)值數(shù)據(jù)表示的三要素進(jìn)位記數(shù)制定、浮點(diǎn)表示如何用二進(jìn)制編碼即:要確定一個數(shù)值數(shù)據(jù)的值必須先確定這三個要素。例如,機(jī)器數(shù)01011001的值是多少?進(jìn)位記數(shù)制十進(jìn)制、二進(jìn)制、十六進(jìn)制、八進(jìn)制數(shù)及其相互轉(zhuǎn)換定/浮點(diǎn)表示(解決小數(shù)點(diǎn)問題)定點(diǎn)整數(shù)、定點(diǎn)小數(shù)浮點(diǎn)數(shù)(可用一個定點(diǎn)小數(shù)和一個定點(diǎn)整數(shù)來表示)定點(diǎn)數(shù)的編碼(解決正負(fù)號問題)原碼、補(bǔ)碼、反碼、移碼(反碼很少用)答案是:不知道!
SignandMagnitude(原碼的表示)BinaryDecimal0123456700000001001000110100010101100111
容易理解,但是:0的表示不唯一,故不利于程序員編程
加、減運(yùn)算方式不統(tǒng)一
需額外對符號位進(jìn)行處理,故不利于硬件設(shè)計
特別當(dāng)a<b時,實(shí)現(xiàn)a-b比較困難從50年代開始,整數(shù)都采用補(bǔ)碼表示但浮點(diǎn)數(shù)的尾數(shù)還是用原碼定點(diǎn)小數(shù)表示BinaryDecimal-0-1-2-3-4-5-6-710001001101010111100110111101111補(bǔ)碼-模運(yùn)算(modular運(yùn)算)時鐘是一種模12系統(tǒng)假定鐘表時針指向10點(diǎn),要將它撥向6點(diǎn),則有兩種撥法:①倒撥4格:10-4=6②順撥8格:10+8=18≡6(mod12)模12系統(tǒng)中:10-4≡10+8(mod12)-4≡8(mod12)
則,稱8是-4對模12的補(bǔ)碼(即:-4的模12補(bǔ)碼等于8)。同樣有-3≡9(mod12)-5≡7(mod12)等結(jié)論2:對于某一確定的模,某數(shù)減去小于模的另一數(shù),總可以用該數(shù)加上另一數(shù)負(fù)數(shù)的補(bǔ)碼來代替。補(bǔ)碼(modular運(yùn)算):+和–的統(tǒng)一
重要概念:在一個模運(yùn)算系統(tǒng)中,一個數(shù)與它除以“?!焙蟮挠鄶?shù)等價。結(jié)論1:一個負(fù)數(shù)的補(bǔ)碼等于模減該負(fù)數(shù)的絕對值。現(xiàn)實(shí)世界中的模運(yùn)算系統(tǒng)補(bǔ)碼的表示現(xiàn)實(shí)世界的模運(yùn)算系統(tǒng)舉例例1:“鐘表”模運(yùn)算系統(tǒng)假定時針只能順撥,從10點(diǎn)倒撥4格后是幾點(diǎn)?10-4=10+(12-4)=10+8=6(mod12)例2:“4位十進(jìn)制數(shù)”模運(yùn)算系統(tǒng)假定算盤只有四檔,且只能做加法,則在算盤上計算9828-1928等于多少?9828-1928=9828+(104-1928)=9828+8072=17900 =7900(mod104)取模即只留余數(shù),高位“1”被丟棄!相當(dāng)于只有低4位留在算盤上。計算機(jī)中的運(yùn)算器是模運(yùn)算系統(tǒng)
8位二進(jìn)制加法器模運(yùn)算系統(tǒng)
計算01111111-01000000=?
01111111-01000000=01111111+(28-
01000000)=01111111+11000000=100111111(mod28)
=00111111只留余數(shù),“1”被丟棄結(jié)論1:一個負(fù)數(shù)的補(bǔ)碼等于對應(yīng)正數(shù)補(bǔ)碼的“各位取反、末位加1”運(yùn)算器適合用補(bǔ)碼表示和運(yùn)算0000000110000010010011101111011101011010101111001101001101101001運(yùn)算器只有有限位,假設(shè)為n位,則運(yùn)算結(jié)果只能保留低n位,故可看成是個只有n檔的二進(jìn)制算盤,因此,其模為2n。當(dāng)n=4時,共有16個機(jī)器數(shù):0000~1111,可看成是模為24的鐘表系統(tǒng)。真值的范圍為-8~+7補(bǔ)碼的定義假定補(bǔ)碼有n位,則:[X]補(bǔ)=2n+X(-2n-1≤X<2n-1
,mod2n)X是真值,[x]補(bǔ)是機(jī)器數(shù)真值和機(jī)器數(shù)的含義是什么?求特殊數(shù)的補(bǔ)碼②[-1]補(bǔ)=2n-0…01=11…1(n個1)(mod2n)假定機(jī)器數(shù)有n位①[-2n-1]補(bǔ)=2n-2n-1=10…0(n-1個0)(mod2n)③[+0]補(bǔ)=[-0]補(bǔ)=00…0(n個0)
32位機(jī)器中,int、short、char型數(shù)據(jù)的機(jī)器數(shù)各占幾位?補(bǔ)碼與真值之間的簡便轉(zhuǎn)換例:設(shè)機(jī)器數(shù)有8位,求123和-123的補(bǔ)碼表示。解:123=127–4=01111111B–100B=01111011B
–
123=–01111011B[01111011]補(bǔ)=28+01111011=100000000+01111011
=01111011(mod28),即7BH。
[–
01111011]補(bǔ)=28–01111011=100000000–01111011=11111111–01111011+1=10000100+1
=10000101,即85H。如何快速得到123的二進(jìn)制表示?各位取反,末位加1當(dāng)機(jī)器數(shù)為16位時,結(jié)果怎樣?Unsignedinteger(無符號整數(shù))機(jī)器中字的位排列順序有兩種方式:(例:32位字:0…010112)高到低位從左到右:00000000000000000000000000001011高到低位從右到左:11010000000000000000000000000000Leftmost和rightmost這兩個詞有歧義,故用LSB(LeastSignificantBit)來表示最低有效位,用MSB來表示最高有效位高位到低位多采用從左往右排列一般在全部是正數(shù)運(yùn)算且不出現(xiàn)負(fù)值結(jié)果的場合下,可使用無符號數(shù)表示。例如,地址運(yùn)算,編號表示,等等無符號整數(shù)的編碼中沒有符號位能表示的最大值大于位數(shù)相同的帶符號整數(shù)的最大值(Why?)例如,8位無符號整數(shù)最大是255(11111111)而8位帶符號整數(shù)最大為127(01111111)總是整數(shù),所以很多時候就簡稱為“無符號數(shù)”MSBLSBSignedinteger(帶符號整數(shù),定點(diǎn)整數(shù))計算機(jī)必須能處理正數(shù)(positive)和負(fù)數(shù)(negative),MSB表示數(shù)符有三種定點(diǎn)編碼方式Signedmagnitude(原碼)
現(xiàn)用來表示浮點(diǎn)(實(shí))數(shù)的尾數(shù)One’scomplement(反碼)現(xiàn)已不用于表示數(shù)值數(shù)據(jù)Two’scomplement(補(bǔ)碼)
50年代以來,所有計算機(jī)都用補(bǔ)碼來表示定點(diǎn)整數(shù)為什么用補(bǔ)碼表示帶符號整數(shù)?補(bǔ)碼運(yùn)算系統(tǒng)是模運(yùn)算系統(tǒng),加、減運(yùn)算統(tǒng)一數(shù)0的表示唯一,方便使用比原碼和反碼多表示一個最小負(fù)數(shù)C語言程序中的整數(shù)關(guān)系表達(dá)式運(yùn)算類型結(jié)果說明0==0U-1<0-1<0U2147483647>-2147483647-12147483647U>-2147483647-12147483647>(int)2147483648U-1>-2(unsigned)-1>-2無符號數(shù):unsignedint(short/long);帶符號整數(shù):int(short/long)常在一個數(shù)的后面加一個“u”或“U”表示無符號數(shù)C語言標(biāo)準(zhǔn)規(guī)定:若運(yùn)算中同時有無符號和帶符號整數(shù),則按無符號整數(shù)運(yùn)算假定以下關(guān)系表達(dá)式在32位用補(bǔ)碼表示的機(jī)器上執(zhí)行,結(jié)果是什么?C語言標(biāo)準(zhǔn)規(guī)定了各類型最小取值范圍,如:int型至少應(yīng)為16位,取值范圍為-32768到32767,而int型數(shù)據(jù)具體的取值范圍則由ABI規(guī)范規(guī)定。C語言程序中的整數(shù)關(guān)系表達(dá)式類型結(jié)果說明0==0U-1<0-1<0U2147483647>-2147483647-12147483647U>-2147483647-12147483647>(int)2147483648U-1>-2(unsigned)-1>-2無帶無帶無帶帶無11
0*1
0*
1*1100…0B=00…0B11…1B(-1)<00…0B(0)11…1B(232-1)>00…0B(0)011…1B(231-1)>100…0B(-231)011…1B(231-1)<100…0B(231)011…1B(231-1)>100…0B(-231)11…1B(-1)>11…10B(-2)11…1B(232-1)>11…10B(232-2)帶*的結(jié)果與常規(guī)預(yù)想的相反!C語言程序中的整數(shù)例如,考慮以下C代碼:1 intx=–1;2 unsignedu=2147483648;34 printf(“x=%u=%d\n”,x,x);5 printf(“u=%u=%d\n”,u,u);在32位機(jī)器上運(yùn)行上述代碼時,它的輸出結(jié)果是什么?為什么?x=4294967295=–1u=2147483648=–2147483648
因為–1的補(bǔ)碼整數(shù)表示為“11…1”,作為32位無符號數(shù)解釋時,其值為232–1=4294967296–1=4294967295。231的無符號數(shù)表示為“100…0”,被解釋為32位帶符號整數(shù)時,其值為最小負(fù)數(shù):–232-1=–231=–2147483648。C語言程序中的整數(shù)1)在有些32位系統(tǒng)上,C表達(dá)式-2147483648<2147483647的執(zhí)行結(jié)果為false。Why?2)若定義變量“inti=-2147483648;”,則“i<2147483647”的執(zhí)行結(jié)果為true。Why?3)如果將表達(dá)式寫成“-2147483647-1<2147483647”,則結(jié)果會怎樣呢?Why?1)在ISOC90標(biāo)準(zhǔn)下,2147483648為unsignedint型,因此
“-2147483648<2147483647”按無符號數(shù)比較,10……0B比01……1大,結(jié)果為false。
在ISOC99標(biāo)準(zhǔn)下,2147483648為longlong型,因此
“-2147483648<2147483647”按帶符號整數(shù)比較,10……0B比01……1小,結(jié)果為true。2)i<2147483647按int型數(shù)比較,結(jié)果為true。3)-2147483647-1<2147483647按int型比較,結(jié)果為true。由C語言中的“IntegerPromotion”規(guī)則決定的。編譯器處理常量時默認(rèn)的類型C90 范圍類型0~231-1int231~232-1unsignedint232~263-1longlong263~264-1unsignedlonglongC99范圍類型0~231-1int231~263-1longlong263~264-1unsignedlonglong231=2147483648,機(jī)器數(shù)為:100┅0(31個0)C90上的運(yùn)行結(jié)果是什么?C99的結(jié)果大家回去試試。Example:
mantissa(尾數(shù))exponent(階碼、指數(shù))
6.02x1021
decimalpoint
radix(base,基)°Normalizedform(規(guī)格化形式):小數(shù)點(diǎn)前只有一位非0數(shù)°同一個數(shù)有多種表示形式。例:對于數(shù)1/1,000,000,000?Normalized(唯一的規(guī)格化形式):1.0x10-9?Unnormalized(非規(guī)格化形式不唯一):0.1x10-8,10.0x10-10科學(xué)計數(shù)法(ScientificNotation)與浮點(diǎn)數(shù)
mantissa(尾數(shù))exponent(指數(shù))0.101two
x
2
-10
binarypoint基為2forBinaryNumbers:只要對尾數(shù)和指數(shù)分別編碼,就可表示一個浮點(diǎn)數(shù)(即:實(shí)數(shù))浮點(diǎn)數(shù)(FloatingPoint)的表示范圍例:畫出下述32位浮點(diǎn)數(shù)格式的規(guī)格化數(shù)的表示范圍。
018931
假設(shè)第0位數(shù)符S;第1~8位為8位移碼表示階碼E(偏置常數(shù)為128);第9~31位為24位二進(jìn)制原碼小數(shù)表示的尾數(shù)數(shù)值部分M。規(guī)格化尾數(shù)的小數(shù)點(diǎn)后第一位總是1,第一位默認(rèn)的“1”不明顯表示出來。這樣可用23個數(shù)位表示24位尾數(shù)。S階碼E尾數(shù)M最大正數(shù):0.11…1x211…1=(1-2-24)x2127
最小正數(shù):0.10…0x200…0=(1/2)x2-128
因為原碼是對稱的,所以其表示范圍關(guān)于原點(diǎn)對稱。機(jī)器0:尾數(shù)為0或落在下溢區(qū)中的數(shù)浮點(diǎn)數(shù)范圍比定點(diǎn)數(shù)大,但數(shù)的個數(shù)沒變多,故數(shù)之間更稀疏,且不均勻
正下溢
負(fù)下溢
-
(1-2-24)
×2127
數(shù)軸
零
可表示的正數(shù)
可表示的負(fù)數(shù)
-2-129
0
2-129
(1-2-24)
×2127
正上溢
負(fù)上溢
+/-0.1xxxxx
×2E浮點(diǎn)數(shù)的表示°Normalformat(規(guī)格化數(shù)形式):
+/-1.xxxxxxxxxx
×RExponent°32-bit規(guī)格化數(shù):310
S
Exponent
Significand1bit?bits?bits
S
是符號位(Sign)
Exponent用移碼(增碼)來表示Significand表示xxxxxxxxxxxxx,尾數(shù)部分
(基可以是2/4/8/16,約定信息,無需顯式表示)°早期的計算機(jī),各自定義自己的浮點(diǎn)數(shù)格式問題:浮點(diǎn)數(shù)表示不統(tǒng)一會帶來什么問題?“Father”oftheIEEE754standard現(xiàn)在所有計算機(jī)都采用IEEE754來表示浮點(diǎn)數(shù)1970年代后期,IEEE成立委員會著手制定浮點(diǎn)數(shù)標(biāo)準(zhǔn)1985年完成浮點(diǎn)數(shù)標(biāo)準(zhǔn)IEEE754的制定Prof.WilliamKahan
/~wkahan/ieee754status/754story.htmlThisstandardwasprimarilytheworkofoneperson,UCBerkeleymathprofessorWilliamKahan.
直到80年代初,各個機(jī)器內(nèi)部的浮點(diǎn)數(shù)表示格式還沒有統(tǒng)一
因而相互不兼容,機(jī)器之間傳送數(shù)據(jù)時,帶來麻煩
IEEE754標(biāo)準(zhǔn)
SinglePrecision:
S
Exponent
Significand
1bit8bits23bits°Signbit:1表示negative;0表示positive°Significand(尾數(shù)):?規(guī)格化尾數(shù)最高位總是1,所以隱含表示,省1位?1+23bits(single),1+52bits(double)°Exponent(階碼/指數(shù)編碼):SP規(guī)格化數(shù)階碼范圍為00000001(-126)~11111110(127)bias為127(single),1023(double)SP:(-1)Sx(1+Significand)x2(Exponent-127)DP:(-1)Sx(1+Significand)x2(Exponent-1023)全0和全1用來表示特殊值!為什么用127?若用128,則階碼范圍為多少?00000001(-127)~11111110(126)規(guī)格化數(shù):+/-1.xxxxxxxxxxtwox2Exponent規(guī)定:小數(shù)點(diǎn)前總是1,故可隱含表示。注意:和前面例子規(guī)定不一樣!Ex:ConvertingBinaryFPtoDecimal10111110111000000000000000000000°Sign:1=>negative°Exponent:?01111101two=125ten?Biasadjustment:125-127=-2°Significand:
1+1x2-1+1x2-2+0x2-3+0x2-4+0x2-5+...=1+2-1+2-2=1+0.5+0.25=1.75°Represents:-1.75tenx2-2=-0.4375(-1)S
x(1+Significand)x2(Exponent-127)BEE00000H
isthehex.Rep.OfanIEEE754SPFPnumberEx:ConvertingDecimaltoFP-12.751.Denormalize:-12.752.Convertintegerpart:12=8+4=110023.Convertfractionalpart:.75=.5+.25=.1124.Putpartstogetherandnormalize:1100.11=1.10011x235.Convertexponent:127+3=128+2=10000010211000001010011000000000000000000TheHexrep.isC14C0000HNormalizednumbers(規(guī)格化數(shù))ExponentSignificandObject1-254anythingNormsimplicitleading100?0nonzero?2550?255nonzero?前面的定義都是針對規(guī)格化數(shù)(normalizedform)Howaboutotherpatterns?Representationfor0Howtorepresent0?
exponent:allzeros
significand:allzeros
Whataboutsign?Bothcasesvalid.+0:00000000000000000000000000000000-0:10000000000000000000000000000000Representationfor+∞/-∞
Howtorepresent+∞/-∞??Exponent:
allones(11111111B=255)?Significand:allzeros
+∞:01111111100000000000000000000000-∞:11111111100000000000000000000000Operations5.0/0=+∞,-5.0/0=-∞5+(+∞)=+∞,(+∞)+(+∞)=+∞5-(+∞)=-∞,(-∞)-(+∞)=-∞etc為什么要這樣處理??可以利用+∞/-∞作比較。例如:X/0>Y可作為有效比較InFP,除數(shù)為0的結(jié)果是+/-∞,不是溢出異常.(整數(shù)除0為異常)∞:infinityRepresentationfor“NotaNumber”Sqrt(-4.0)=?0/0=?CalledNotaNumber(NaN)-“非數(shù)”O(jiān)perations
sqrt(-4.0)=NaN0/0=NaNop(NaN,x)=NaN+∞+(-∞)=NaN+∞-(+∞)=NaN∞/∞=NaNetc.HowtorepresentNaN
Exponent=255
Significand:nonzeroNaNscanhelpwithdebuggingWhathavewedefinedsofar?(forSP)RepresentationforDenorms(非規(guī)格化數(shù))
UsedtorepresentDenormalizednumbersExponentSignificandObject00+/-00nonzeroDenorms
1-254anythingNormsimplicitleading12550+/-infinity255nonzeroNaNRepresentationforDenorms2-1262-1252-1242-1231.0…0x2-126~1.1…1x2-1260.0…0x2-126~0.1…1x2-1262-1262-1252-1242-12300GAP
NormalizednumbersDenorms(-1)s×0.xx…x×2-126關(guān)于浮點(diǎn)數(shù)精度的一個例子
第一講小結(jié)在機(jī)器內(nèi)部編碼后的數(shù)稱為機(jī)器數(shù),其值稱為真值定義數(shù)值數(shù)據(jù)有三個要素:進(jìn)制、定點(diǎn)/浮點(diǎn)、編碼整數(shù)的表示無符號數(shù):正整數(shù),用來表示地址等;帶符號整數(shù):用補(bǔ)碼表示C語言中的整數(shù)無符號數(shù):unsignedint(short/long);帶符號數(shù):int(short/long)浮點(diǎn)數(shù)的表示符號;尾數(shù):定點(diǎn)小數(shù);指數(shù)(階):定點(diǎn)整數(shù)(基不用表示)浮點(diǎn)數(shù)的范圍正上溢、正下溢、負(fù)上溢、負(fù)下溢;與階碼的位數(shù)和基的大小有關(guān)浮點(diǎn)數(shù)的精度:與尾數(shù)的位數(shù)和是否規(guī)格化有關(guān)浮點(diǎn)數(shù)的表示(IEEE754標(biāo)準(zhǔn)):單精度SP(float)和雙精度DP(double)規(guī)格化數(shù)(SP):階碼1~254,尾數(shù)最高位隱含為1“零”(階為全0,尾為全0)∞(階為全1,尾為全0)NaN(階為全1,尾為非0)非規(guī)格化數(shù)(階為全0,尾為非0,隱藏位為0)十進(jìn)制數(shù)的表示:用ASCII碼或BCD碼表示10在計算機(jī)中有幾種可能的表示?
-10呢?數(shù)據(jù)的表示和運(yùn)算分以下五個部分介紹第一講:數(shù)值數(shù)據(jù)的表示定點(diǎn)數(shù)編碼、整數(shù)的表示、浮點(diǎn)數(shù)表示C語言程序的整數(shù)類型和浮點(diǎn)數(shù)類型第二講:非數(shù)值數(shù)據(jù)的表示、數(shù)據(jù)的存放方式邏輯值、西文字符、漢字字符數(shù)據(jù)寬度單位、大端/小端第三講:加法器和算術(shù)邏輯部件按位運(yùn)算\邏輯運(yùn)算\移位運(yùn)算\位擴(kuò)展和位截斷運(yùn)算無符號和帶符號整數(shù)的加減運(yùn)算、ALU第四講:定點(diǎn)數(shù)乘除運(yùn)算無符號和帶符號整數(shù)的乘除運(yùn)算變量與常數(shù)之間的乘除運(yùn)算第五講:浮點(diǎn)數(shù)加減乘除運(yùn)算從C程序的表達(dá)式出發(fā),用機(jī)器數(shù)在電路中的執(zhí)行來解釋表達(dá)式的執(zhí)行結(jié)果表示用一位表示。例如,真:1/假:0N位二進(jìn)制數(shù)可表示N個邏輯數(shù)據(jù),或一個位串運(yùn)算按位進(jìn)行如:按位與/按位或/邏輯左移/邏輯右移等識別邏輯數(shù)據(jù)和數(shù)值數(shù)據(jù)在形式上并無差別,也是一串0/1序列,機(jī)器靠指令來識別。位串用來表示若干個狀態(tài)位或控制位(OS中使用較多)
例如,x86的標(biāo)志寄存器含義如下:
邏輯數(shù)據(jù)的編碼表示CFPFAFZFSFTFIFDFOF特點(diǎn)是一種拼音文字,用有限幾個字母可拼寫出所有單詞只對有限個字母和數(shù)學(xué)符號、標(biāo)點(diǎn)符號等輔助字符編碼所有字符總數(shù)不超過256個,使用7或8個二進(jìn)位可表示表示(常用編碼為7位ASCII碼)十進(jìn)制數(shù)字:0/1/2…/9英文字母:A/B/…/Z/a/b/…/z專用符號:+/-/%/*/&/……控制字符(不可打印或顯示)操作字符串操作,如:傳送/比較等
西文字符的編碼表示必須熟悉對應(yīng)的ASCII碼!特點(diǎn)漢字是表意文字,一個字就是一個方塊圖形。漢字?jǐn)?shù)量巨大,總數(shù)超過6萬字,給漢字在計算機(jī)內(nèi)部的表示、漢字的傳輸與交換、漢字的輸入和輸出等帶來了一系列問題。編碼形式有以下幾種漢字代碼:輸入碼:對漢字用相應(yīng)按鍵進(jìn)行編碼表示,用于輸入內(nèi)碼:用于在系統(tǒng)中進(jìn)行存儲、查找、傳送等處理字模點(diǎn)陣或輪廓描述:
描述漢字字模點(diǎn)陣或輪廓,用于顯示/打印
漢字及國際字符的編碼表示問題:西文字符有沒有輸入碼?有沒有內(nèi)碼?有沒有字模點(diǎn)陣或輪廓描述?漢字內(nèi)碼至少需2個字節(jié)才能表示一個漢字內(nèi)碼。為什么?由漢字的總數(shù)決定!可在GB2312國標(biāo)碼的基礎(chǔ)上產(chǎn)生漢字內(nèi)碼為與ASCII碼區(qū)別,將國標(biāo)碼的兩個字節(jié)的第一位置“1”后得到一種漢字內(nèi)碼例如,漢字“大”在碼表中位于第20行、第83列。因此區(qū)位碼為00101001010011,國標(biāo)碼為00110100
01110011,即3473H。前面的34H和字符“4”的ACSII碼相同,后面的73H和字符“s”的ACSII碼相同,將每個字節(jié)的最高位各設(shè)為“1”后,就得到其內(nèi)碼:B4F3H(1011010011110011B),因而不會和ASCII碼混淆。為便于打印、顯示漢字,漢字字形必須預(yù)先存在機(jī)內(nèi)字庫(font):所有漢字形狀的描述信息集合不同字體(如宋體、仿宋、楷體、黑體等)對應(yīng)不同字庫從字庫中找到字形描述信息,然后送設(shè)備輸出問題:如何知道到哪里找相應(yīng)的字形信息?漢字內(nèi)碼與其在字庫中的位置有關(guān)??!字形主要有兩種描述方法:字模點(diǎn)陣描述(圖像方式)輪廓描述(圖形方式)直線向量輪廓曲線輪廓(TrueType字形)漢字的字模點(diǎn)陣碼和輪廓描述數(shù)據(jù)的基本寬度比特(bit)是計算機(jī)中處理、存儲、傳輸信息的最小單位二進(jìn)制信息的計量單位是“字節(jié)”(Byte),也稱“位組”現(xiàn)代計算機(jī)中,存儲器按字節(jié)編址字節(jié)是最小可尋址單位(addressableunit)
如果以字節(jié)為一個排列單位,則LSB表示最低有效字節(jié),MSB表示最高有效字節(jié)除比特和字節(jié)外,還經(jīng)常使用“字”(word)作為單位“字”和“字長”的概念不同IA-32中的“字”有多少位?字長多少位呢?DWORD:32位QWORD:64位16位32位數(shù)據(jù)的基本寬度“字”和“字長”的概念不同“字長”指數(shù)據(jù)通路的寬度。(數(shù)據(jù)通路指CPU內(nèi)部數(shù)據(jù)流經(jīng)的路徑以及路徑上的部件,主要是CPU內(nèi)部進(jìn)行數(shù)據(jù)運(yùn)算、存儲和傳送的部件,這些部件的寬度基本上要一致,才能相互匹配。因此,”字長”等于CPU內(nèi)部總線的寬度、運(yùn)算器的位數(shù)、通用寄存器的寬度等。)“字”表示被處理信息的單位,用來度量數(shù)據(jù)類型的寬度。字和字長的寬度可以一樣,也可不同。例如,x86體系結(jié)構(gòu)定義“字”的寬度為16位,但從386開始字長就是32位了。數(shù)據(jù)量的度量單位存儲二進(jìn)制信息時的度量單位要比字節(jié)或字大得多容量經(jīng)常使用的單位有:“千字節(jié)”(KB),1KB=210字節(jié)=1024B“兆字節(jié)”(MB),1MB=220字節(jié)=1024KB“千兆字節(jié)”(GB),1GB=230字節(jié)=1024MB“兆兆字節(jié)”(TB),1TB=240字節(jié)=1024GB
通信中的帶寬使用的單位有:“千比特/秒”(kb/s),1kbps=103b/s=1000bps“兆比特/秒”(Mb/s),1Mbps=106b/s
=1000kbps“千兆比特/秒”(Gb/s),1Gbps=109b/s=1000Mbps“兆兆比特/秒”(Tb/s),1Tbps=1012b/s=1000Gbps如果把b換成B,則表示字節(jié)而不是比特(位)例如,10MB/s表示10兆字節(jié)/秒數(shù)據(jù)的存儲和排列順序80年代開始,通用機(jī)器都采用字節(jié)編址ISA設(shè)計時要考慮的兩個問題:如何根據(jù)一個字節(jié)地址取到一個32位的字?-字的存放問題一個字能否存放在任何字節(jié)邊界?-字的邊界對齊問題若inti=-65535,存放在100號單元(占用100#~103#),則用取數(shù)指令訪問100號單元取出i時,必須清楚i的4個字節(jié)是如何存放的。msblsb103#102#101#100#littleendianword100#100#101#102#103#bigendianword100#Word:FFFF0001大端方式(BigEndian):MSB所在的地址是數(shù)的地址
e.g.IBM360/370,Motorola68k,MIPS,Sparc,HPPA小端方式(LittleEndian):LSB所在的地址是數(shù)的地址
e.g.Intel80x86,DECVAX
有些機(jī)器兩種方式都支持,可通過特定控制位來設(shè)定采用哪種方式。65535=216-1[-65535]補(bǔ)=FFFF0001HBIGEndianversusLittleEndian
Ex3:Memorylayoutofainstructionlocatedin1000假定小端機(jī)器中指令:movAX,0x12345(BX)其中操作碼mov為40H,寄存器AX和BX的編號分別為0001B和0010B,立即數(shù)00012345H占32位,則存放順序為:
若在大端機(jī)器上,則存放順序如何?401200012345401245230100000123451240452301001240100510041003100210011000地址對于小端方式機(jī)器,指令中立即數(shù)的順序為逆序即指令地址為1000ByteSwapProblem(字節(jié)交換問題)785634120123increasingbyteaddressBigEndian123456780123LittleEndian
每個系統(tǒng)內(nèi)部是一致的,但在系統(tǒng)間通信時可能會發(fā)生問題!因為順序不同,需要進(jìn)行順序轉(zhuǎn)換音、視頻和圖像等文件格式或處理程序都涉及到字節(jié)順序問題
ex.Littleendian:GIF,PCPaintbrush,MicrosoftRTF,etc
Bigendian:AdobePhotoshop,JPEG,MacPaint,etc
上述存放在0號單元的數(shù)據(jù)(字)是什么?12345678H!存放方式不同的機(jī)器間程序移植或數(shù)據(jù)通信時,會發(fā)生什么問題?C表達(dá)式類型轉(zhuǎn)換順序unsignedlonglong↑longlong↑unsigned↑
int↑(unsigned)char,short猜測執(zhí)行結(jié)果是什么?01檢測系統(tǒng)的字節(jié)順序union的存放順序是所有成員從低地址開始,利用該特性可測試CPU的大/小端方式。請猜測在IA-32上的打印結(jié)果。關(guān)于大端小端以下在x86機(jī)器上運(yùn)行的程序,判斷出x86是大端方式!錯在哪里?uniontest{inta;
charb;}main(){test.a=0xff;
if(test.b==0xff)printf(“Littleendian“);elseprintf(“Bigendian“);}FF000000小地址大地址小端按照C語言標(biāo)準(zhǔn),test.b從char型提升為int型,0xff為int型,故按int型比在IA-32中,char為signedchar,擴(kuò)展為32位后為全1,真值為-1;而0xff的真值是255;等式左右不等!在RISC-V中,char為unsignedchar,擴(kuò)展為32位后為0x000000ff,因而,等式左右都是255,相等!C語言標(biāo)準(zhǔn)沒有明確規(guī)定char為無符號還是帶符號整型,當(dāng)程序移植到另一個系統(tǒng)時,其行為可能發(fā)生變化,從而造成難以理解的結(jié)果。為避免這種情況,程序員應(yīng)盡量編寫行為確定的程序,對于一字節(jié)整數(shù),應(yīng)顯式定義成signedchar或unsignedchar,作字符處理時,則可使用char型。未確定行為(unspecifiedbehavior)語句第二講小結(jié)非數(shù)值數(shù)據(jù)的表示邏輯數(shù)據(jù)用來表示真/假或N位位串,按位運(yùn)算西文字符:用ASCII碼表示漢字:漢字輸入碼、漢字內(nèi)碼、漢字字模碼數(shù)據(jù)的寬度位、字節(jié)、字(不一定等于字長)k/K/M/G/T/P/E/Z/Y有不同的含義數(shù)據(jù)的存儲排列數(shù)據(jù)的地址:連續(xù)若干單元中最小的地址,即:從小地址開始存放數(shù)據(jù)問題:若一個short型數(shù)據(jù)si存放在單元0x08000100和0x08000101中,那么si的地址是什么?大端方式:用MSB存放的地址表示數(shù)據(jù)的地址小端方式:用LSB存放的地址表示數(shù)據(jù)的地址按邊界對齊可減少訪存次數(shù)數(shù)據(jù)的表示和運(yùn)算分以下五個部分介紹第一講:數(shù)值數(shù)據(jù)的表示定點(diǎn)數(shù)編碼、整數(shù)的表示、浮點(diǎn)數(shù)表示C語言程序的整數(shù)類型和浮點(diǎn)數(shù)類型第二講:非數(shù)值數(shù)據(jù)的表示、數(shù)據(jù)的存放方式邏輯值、西文字符、漢字字符數(shù)據(jù)寬度單位、大端/小端第三講:加法器和算術(shù)邏輯部件按位運(yùn)算\邏輯運(yùn)算\移位運(yùn)算\位擴(kuò)展和位截斷運(yùn)算無符號和帶符號整數(shù)的加減運(yùn)算、ALU第四講:定點(diǎn)數(shù)乘除運(yùn)算無符號和帶符號整數(shù)的乘除運(yùn)算變量與常數(shù)之間的乘除運(yùn)算第五講:浮點(diǎn)數(shù)加減乘除運(yùn)算從C程序的表達(dá)式出發(fā),用機(jī)器數(shù)在電路中的執(zhí)行來解釋表達(dá)式的執(zhí)行結(jié)果數(shù)據(jù)的運(yùn)算高級語言程序中涉及的運(yùn)算(以C語言為例)整數(shù)算術(shù)運(yùn)算、浮點(diǎn)數(shù)算術(shù)運(yùn)算按位、邏輯、移位、位擴(kuò)展和位截斷指令集中涉及的運(yùn)算定點(diǎn)數(shù)運(yùn)算算術(shù)運(yùn)算帶符號整數(shù)運(yùn)算:取負(fù)/符號擴(kuò)展/加/減/乘/除/算術(shù)移位無符號整數(shù)運(yùn)算:0擴(kuò)展/加/減/乘/除邏輯運(yùn)算邏輯操作:與/或/非/…移位操作:邏輯左移/邏輯右移浮點(diǎn)數(shù)運(yùn)算:加、減、乘、除基本運(yùn)算部件ALU的設(shè)計浮點(diǎn)數(shù)有沒有移位操作和擴(kuò)展操作?為什么?C語言程序中涉及的運(yùn)算算術(shù)運(yùn)算(最基本的運(yùn)算)無符號數(shù)、帶符號整數(shù)、浮點(diǎn)數(shù)的+、-、*、/運(yùn)算等按位運(yùn)算用途對位串實(shí)現(xiàn)“掩碼”(mask)操作或相應(yīng)的其他處理(主要用于對多媒體數(shù)據(jù)或狀態(tài)/控制信息進(jìn)行處理)操作按位或:“|”按位與:“&”按位取反:“~”按位異或:“^”問題:如何從16位采樣數(shù)據(jù)y中提取高位字節(jié),并使低字節(jié)為0?可用“&”實(shí)現(xiàn)“掩碼”操作:y&0xFF00例如,當(dāng)y=0x2C0B時,得到結(jié)果為:0x2C00C語言程序中涉及的運(yùn)算邏輯運(yùn)算用途用于關(guān)系表達(dá)式的運(yùn)算例如,if(x>yandi<100)then……中的“and”運(yùn)算操作“‖”表示“OR”運(yùn)算“&&”表示“AND”運(yùn)算
例如,if((x>y)&&(i<100))then……“!”表示“NOT”運(yùn)算與按位運(yùn)算的差別符號表示不同:&
對
&&
;|對
‖;……運(yùn)算過程不同:按位對
整體結(jié)果類型不同:位串對
邏輯值C語言程序中涉及的運(yùn)算移位運(yùn)算用途提取部分信息擴(kuò)大或縮小數(shù)值的2、4、8…倍操作左移::x<<k;右移:x>>k不區(qū)分是邏輯移位還是算術(shù)移位,由x的類型確定無符號數(shù):邏輯左移、邏輯右移高(低)位移出,低(高)位補(bǔ)0,可能溢出!問題:何時可能發(fā)生溢出?如何判斷溢出?若左移時高位移出的是1,則溢出帶符號整數(shù):算術(shù)左移、算術(shù)右移左移:高位移出,低位補(bǔ)0??赡芤绯觯?/p>
溢出判斷:若移出的位不等于新的符號位,則溢出。右移:低位移出,高位補(bǔ)符,可能發(fā)生有效數(shù)據(jù)丟失。如何從16位數(shù)據(jù)y中提取高位字節(jié)?某字長為8的機(jī)器中,x、y和z都是8位帶符號整數(shù),已知x=-81,則y=x/2=?z=2x=?(y>>8)送8位寄存器移位!y=-40?z=-162?C語言程序中涉及的運(yùn)算位擴(kuò)展和位截斷運(yùn)算用途類型轉(zhuǎn)換時可能需要數(shù)據(jù)擴(kuò)展或截斷操作沒有專門操作運(yùn)算符,根據(jù)類型轉(zhuǎn)換前后數(shù)據(jù)長短確定是擴(kuò)展還是截斷擴(kuò)展:短轉(zhuǎn)長無符號數(shù):0擴(kuò)展,前面補(bǔ)0帶符號整數(shù):符號擴(kuò)展,前面補(bǔ)符截斷:長轉(zhuǎn)短
強(qiáng)行將高位丟棄,故可能發(fā)生“溢出”例1(擴(kuò)展操作):在大端機(jī)上輸出si,usi,i,ui的十進(jìn)制和十六進(jìn)制值是什么?shortsi=-32768;unsignedshortusi=si;inti=si;unsingnedui=usi;si=-327688000usi=327688000i=-32768FFFF8000ui=3276800008000例2(截斷操作):i和j是否相等?inti=32768;shortsi=(short)i;intj=si;不相等!i=3276800008000si=-327688000j=-32768FFFF8000原因:對i截斷時發(fā)生了溢出,即:32768截斷為16位數(shù)時,因其超出16位能表示的最大值,故無法截斷為正確的16位數(shù)!C語言標(biāo)準(zhǔn)規(guī)定,長數(shù)轉(zhuǎn)換為短數(shù)的結(jié)果是未定義的,沒有規(guī)定編譯器必須報錯如何實(shí)現(xiàn)高級語言源程序中的運(yùn)算?總結(jié):C語言程序中的基本數(shù)據(jù)類型及其基本運(yùn)算類型基本數(shù)據(jù)類型無符號數(shù)、帶符號整數(shù)、浮點(diǎn)數(shù)、位串、字符(串)基本運(yùn)算類型算術(shù)、按位、邏輯、移位、擴(kuò)展和截斷、匹配計算機(jī)如何實(shí)現(xiàn)高級語言程序中的運(yùn)算?將各類表達(dá)式編譯(轉(zhuǎn)換)為指令序列計算機(jī)直接執(zhí)行指令來完成運(yùn)算例:C語言賦值語句“f=(g+h)–(i+j);”中變量i、j、f、g、h由編譯器分別分配給MIPS寄存器$t0~$t4。寄存器$t0~$t7的編號對應(yīng)8~15,上述程序段對應(yīng)的MIPS機(jī)器代碼和匯編表示(#后為注釋)如下:00000001011
011000110100000100000add$t5,$t3,$t4#g+h00000001000010010111000000100000add$t6,$t0,$t1#i+j00000001101011100101000000100010sub$t2,$t5,$t6#f=(g+h)–(i+j)需要提供哪些運(yùn)算類指令才能支持高級語言需求呢?邏輯運(yùn)算、移位、擴(kuò)展和截斷等指令實(shí)現(xiàn)較容易,算術(shù)運(yùn)算指令難!n位整數(shù)加/減運(yùn)算器先看一個C程序段:
intx=9,y=-6,z1,z2;z1=x+y;z2=x-y;
問題:上述程序段中,x和y的機(jī)器數(shù)是什么?z1和z2的機(jī)器數(shù)是什么?回答:x的機(jī)器數(shù)為[x]補(bǔ),y的機(jī)器數(shù)為[y]補(bǔ);z1的機(jī)器數(shù)為[x+y]補(bǔ);
z2的機(jī)器數(shù)為[x-y]補(bǔ)。因此,計算機(jī)中需要有一個電路,能夠?qū)崿F(xiàn)以下功能:已知[x]補(bǔ)和[y]補(bǔ),計算[x+y]補(bǔ)和[x-y]補(bǔ)。根據(jù)補(bǔ)碼定義,有如下公式:[x+y]補(bǔ)=2n+x+y=2n+x+2n+y=[x]補(bǔ)+[y]補(bǔ)(mod2n)[x-y]補(bǔ)=2n+x-y=2n+x+2n-y=[x]補(bǔ)+[-y]補(bǔ)(mod2n)補(bǔ)碼的定義假定補(bǔ)碼有n位,則:[X]補(bǔ)=2n+X(-2n≤X<2n,mod2n)[–y]補(bǔ)=[y]補(bǔ)+1n位整數(shù)加/減運(yùn)算器利用帶標(biāo)志加法器,可構(gòu)造整數(shù)加/減運(yùn)算器,進(jìn)行以下運(yùn)算:無符號整數(shù)加、無符號整數(shù)減帶符號整數(shù)加、帶符號整數(shù)減當(dāng)Sub為1時,做減法當(dāng)Sub為0時,做加法補(bǔ)碼加減運(yùn)算公式[A+B]補(bǔ)
=[A]補(bǔ)
+[B]補(bǔ)
(mod2n)[A–B]補(bǔ)
=[A]補(bǔ)
+[–B]補(bǔ)
(mod2n)實(shí)現(xiàn)減法的主要工作在于:求[–B]補(bǔ)問題:如何求[–B]補(bǔ)?[–B]補(bǔ)=[B]補(bǔ)+1在整數(shù)加/減運(yùn)算部件基礎(chǔ)上,加上寄存器、移位器以及控制邏輯,就可實(shí)現(xiàn)ALU、乘/除運(yùn)算以及浮點(diǎn)運(yùn)算電路Sum加法器444AZFCinCout4B401MUXSubBOF整數(shù)加/減運(yùn)算部件SFCFB'整數(shù)加、減運(yùn)算C語言程序中的整數(shù)有帶符號整數(shù),如char、short、int、long型等無符號整數(shù),如unsignedchar、unsignedshort、unsigned等指針、地址等通常被說明為無符號整數(shù),因而在進(jìn)行指針或地址運(yùn)算時,需要進(jìn)行無符號整數(shù)的加、減運(yùn)算無符號整數(shù)和帶符號整數(shù)的加、減運(yùn)算電路完全一樣,這個運(yùn)算電路稱為整數(shù)加減運(yùn)算部件,基于帶標(biāo)志加法器實(shí)現(xiàn)最基本的加法器,因為只有n位,所以是一種模2n運(yùn)算系統(tǒng)!例:n=4,A=1001,B=1100則:F=0101,Cout=1加法器nnnABFCinCout還記得這個加法器是如何實(shí)現(xiàn)的?n位帶標(biāo)志加法器n位加法器無法用于兩個n位帶符號整數(shù)(補(bǔ)碼)相加,無法判斷是否溢出程序中經(jīng)常需要比較大小,通過(在加法器中)做減法得到的標(biāo)志信息來判斷溢出標(biāo)志OF:OF=Cn
Cn-1符號標(biāo)志SF:SF=Fn-1零標(biāo)志ZF=1當(dāng)且僅當(dāng)F=0;進(jìn)位/借位標(biāo)志CF:CF=CoutCin所有運(yùn)算電路的核心Sum加法器nnnAZFCinCoutnBn01多路選擇器SubBOF加/減運(yùn)算部件CF=CoSubSF當(dāng)Sub為1時,做減法當(dāng)Sub為0時,做加法重要認(rèn)識1:計算機(jī)中所有算術(shù)運(yùn)算都基于加法器實(shí)現(xiàn)!重要認(rèn)識2:加法器不知道所運(yùn)算的是帶符號數(shù)還是無符號數(shù)。重要認(rèn)識3:加法器不判定對錯,總是取低n位作為結(jié)果,并生成標(biāo)志信息。溢出標(biāo)志零標(biāo)志符號標(biāo)志進(jìn)/借位標(biāo)志條件標(biāo)志位(條件碼CC)
零標(biāo)志ZF、溢出標(biāo)志OF、進(jìn)/借位標(biāo)志CF、符號標(biāo)志SF稱為條件標(biāo)志。
條件標(biāo)志(Flag)在運(yùn)算電路中產(chǎn)生,被記錄到專門的寄存器中存放標(biāo)志的寄存器通常稱為程序/狀態(tài)字寄存器或標(biāo)志寄存器。每個標(biāo)志對應(yīng)標(biāo)志寄存器中的一個標(biāo)志位。如,IA-32中的EFLAGS寄存器問題:OF=?ZF=?SF=?CF=?還記得如何得到各個標(biāo)志位嗎?OF:若A與B’同號但與Sum不同號,則1;否則0。SF:sum符號ZF:如Sum為0,則1,否則0。CF:CoutsubSum加法器nnnAZFCinCoutnBn01MuxSelSubBOF整數(shù)加/減運(yùn)算部件SFCFB'問題:為什么要生成并保存條件標(biāo)志?為了在分支指令(條件轉(zhuǎn)移指令)中得到是否轉(zhuǎn)移執(zhí)行的條件!if(i>j){…}n位帶標(biāo)志加法器溢出標(biāo)志OF:OF=Cn
Cn-1符號標(biāo)志SF:SF=Fn-1零標(biāo)志ZF=1當(dāng)且僅當(dāng)F=0;進(jìn)位/借位標(biāo)志CF:CF=CoutCin整數(shù)加法舉例若n=8,計算107+46=?進(jìn)位是真正的符號:+15310710=0110101124610=001011102
0
10011001溢出標(biāo)志OF=1、零標(biāo)志ZF=0、符號標(biāo)志SF=1、進(jìn)位標(biāo)志CF=0SumAddernnnAZFCinCoutnBn01MuxSelSubBOF整數(shù)加/減運(yùn)算部件SFCFB'兩個正數(shù)相加,結(jié)果為負(fù)數(shù),故溢出!即OF=1做加法時,主要判斷是否溢出無符號整數(shù)加溢出條件:CF=1帶符號整數(shù)加溢出條件:OF=1無符號:sum=153,因為CF=0,故未發(fā)生溢出,結(jié)果正確!帶符號:sum=-103,因為OF=1,故發(fā)生溢出,結(jié)果錯誤!整數(shù)減法舉例
帶符號:-7-6=-7+(-6)=+3-3-5=-3+(-5)=-8
無符號:9-6=3
13-5=811++0001111001110111100010001111帶符號(1)最高位和次高位的進(jìn)位不同溢出:(2)和的符號位和加數(shù)的符號位不同X√做減法以比較大小,規(guī)則:Unsigned:CF=0時,大于Signed:OF=SF時,大于OF=0、ZF=0、SF=1、借位CF=0OF=1、ZF=0SF=0、借位CF=0√√驗證:9>6,故CF=0;13>5,故CF=0驗證:-7<6,故OF≠SF-3<5,故OF≠SF無符號減溢出:差為負(fù)數(shù),即借位CF=1整數(shù)減法舉例無符號和帶符號加減運(yùn)算都用該部件執(zhí)行unsignedintx=134;unsignedinty=246;intm=x;intn=y;unsignedintz1=x-y;unsignedintz2=x+y;intk1=m-n;intk2=m+n;x和m的機(jī)器數(shù)一樣:10000110,y和n的機(jī)器數(shù)一樣:11110110z1和k1的機(jī)器數(shù)一樣:10010000,CF=1,OF=0,SF=1z1的值為144(=134-246+256,x-y<0),k1的值為-112。假定n=8SumAddernnnAZFCinCoutnBn01MuxSelSubBOFSFCF無符號減公式:帶符號減公式:整數(shù)加法舉例無符號和帶符號加減運(yùn)算都用該部件執(zhí)行unsignedintx=134;unsignedinty=246;intm=x;intn=y;unsignedintz1=x-y;unsignedintz2=x+y;intk1=m-n;intk2=m+n;x和m的機(jī)器數(shù)一樣:10000110,y和n的機(jī)器數(shù)一樣:11110110z2和k2的機(jī)器數(shù)一樣:01111100,CF=1,OF=1,SF=0z2的值為124(=134+246-256,x+y>256)k2的值為124(=-122+(-10)+256,m+n=-132<-128,即負(fù)溢出)假定n=8SumAddernnnAZFCinCoutnBn01MuxSelSubBOFSFCF無符號加公式:帶符號加公式:算術(shù)邏輯部件(ALU)進(jìn)行基本算術(shù)運(yùn)算與邏輯運(yùn)算無符號整數(shù)加、減帶符號整數(shù)加、減與、或、非、異或等邏輯運(yùn)算核心電路是整數(shù)加/減運(yùn)算部件輸出除和/差等,還有標(biāo)志信息有一個操作控制端(ALUop),用來決定ALU所執(zhí)行的處理功能。ALUop的位數(shù)k決定了操作的種類,例如,當(dāng)位數(shù)k為3時,ALU最多只有23=8種操作。ALUopResultALUopResultALUopResultALUopResult000A加B010A與B100A取反110A001A減B011A或B101AB 111未用回顧:認(rèn)識計算機(jī)中最基本的部件CPU:中央處理器;PC:程序計數(shù)器;MAR:存儲器地址寄存器ALU:算術(shù)邏輯部件;IR:指令寄存器;MDR:存儲器數(shù)據(jù)寄存器GPRs:通用寄存器組(由若干通用寄存器組成)控制器CPUPC輸入設(shè)備輸出設(shè)備MARMDRALU標(biāo)志寄存器
IR地址數(shù)據(jù)控制GPRs0123存儲器01234567數(shù)據(jù)的表示和運(yùn)算分以下五個部分介紹第一講:數(shù)值數(shù)據(jù)的表示定點(diǎn)數(shù)編碼、整數(shù)的表示、浮點(diǎn)數(shù)表示C語言程序的整數(shù)類型和浮點(diǎn)數(shù)類型第二講:非數(shù)值數(shù)據(jù)的表示、數(shù)據(jù)的存放方式邏輯值、西文字符、漢字字符數(shù)據(jù)寬度單位、大端/小端第三講:加法器和算術(shù)邏輯部件按位運(yùn)算\邏輯運(yùn)算\移位運(yùn)算\位擴(kuò)展和位截斷運(yùn)算無符號和帶符號整數(shù)的加減運(yùn)算、ALU第四講:定點(diǎn)數(shù)乘除運(yùn)算無符號和帶符號整數(shù)的乘除運(yùn)算變量與常數(shù)之間的乘除運(yùn)算第五講:浮點(diǎn)數(shù)加減乘除運(yùn)算從C程序的表達(dá)式出發(fā),用機(jī)器數(shù)在電路中的執(zhí)行來解釋表達(dá)式的執(zhí)行結(jié)果整數(shù)的乘運(yùn)算
通常,高級語言中兩個n位整數(shù)相乘得到的結(jié)果通常也是一個n位整數(shù),也即,結(jié)果只取2n位乘積中的低n位。例如,在C語言中,參加運(yùn)算的兩個操作數(shù)的類型和結(jié)果的類型必須一致,如果不一致則會先轉(zhuǎn)換為一致的數(shù)據(jù)類型再進(jìn)行計算。intmul(intx,inty){ intz=x*y; returnz;}x*y被轉(zhuǎn)換為乘法指令,在乘法運(yùn)算電路中得到的乘積是64位,但是,只取其低32位賦給z。無符號數(shù)的乘法運(yùn)算Paperandpencilexample: Multiplicand1000
Multiplierx1001
1000
0000
0000
1000Product(積)0.1001000假定:[X]原=x0.x1
xn,[Y]原=y0.y1
yn
,求[x×Y]原數(shù)值部分z1z2n=(0.x1xn)×(0.y1yn)(小數(shù)點(diǎn)位置約定,不區(qū)分小數(shù)還是整數(shù))X×y4×2-4X×y3×2-3X×y2×2-2X×y1×2-1
4X×Y=
(X×yi×2-i)i=1整個運(yùn)算過程中用到兩種操作:加法+左移因而,可用ALU和移位器來實(shí)現(xiàn)乘法運(yùn)算n=4無符號數(shù)的乘法運(yùn)算手工乘法的特點(diǎn):每步計算:X×yi,若yi=0,則得0;若yi=1,則得X把①求得的各項結(jié)果X×yi逐次左移,可表示為X×yi×2-i
對②中結(jié)果求和,即
(X×yi×2-i),這就是兩個無符號數(shù)的乘積計算機(jī)內(nèi)部稍作以下改進(jìn):每次得X×yi后,與前面所得結(jié)果累加,得到Pi,稱之為部分積。因為不等到最后一次求和,減少了保存各次相乘結(jié)果X×yi的開銷。每次得X×yi后,不將它左移與前次部分積Pi相加,而將部分積Pi右移后與X×yi相加。因為加法運(yùn)算始終對部分積中高n位進(jìn)行。故用n位加法器可實(shí)現(xiàn)二個n位數(shù)相乘。對乘數(shù)中為“1”的位執(zhí)行加法和右移,對為“0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銀行形體禮儀面試題及答案
- 2025年專升本試題及答案政治
- 2025年銀行入營考試題庫及答案
- 2025年專升本考試試題全套及答案
- 2025年專升本海量題庫及答案
- 2025年專升本會計考試題庫貴州
- 2025年專業(yè)監(jiān)理工程師答辯試題
- 2025年專業(yè)導(dǎo)論統(tǒng)計學(xué)考試題
- 詠鵝教學(xué)課件
- 長樂一中教學(xué)課件
- 2025年度國務(wù)院國資委機(jī)關(guān)服務(wù)中心招聘(2人)筆試備考試題附答案詳解(a卷)
- 煤礦矸石上管理辦法
- 2025廣西公需科目試題及答案
- 注塑機(jī)洗機(jī)管理辦法
- 簡單安全施工方案(3篇)
- 2025年北京信息職業(yè)技術(shù)學(xué)院單招筆試綜合素質(zhì)試題庫含答案解析(5套共100道單選合輯)
- 文化展廳使用管理辦法
- 打字員技能測試題庫及答案
- 農(nóng)業(yè)產(chǎn)學(xué)研合作問題及解決路徑
- 2025年營養(yǎng)師(初級)專業(yè)能力模擬試題
- 預(yù)防電信詐騙管理辦法
評論
0/150
提交評論