ICS計(jì)算機(jī)基礎(chǔ)教學(xué)課件第二章習(xí)題答案202307062317199297043_第1頁
ICS計(jì)算機(jī)基礎(chǔ)教學(xué)課件第二章習(xí)題答案202307062317199297043_第2頁
ICS計(jì)算機(jī)基礎(chǔ)教學(xué)課件第二章習(xí)題答案202307062317199297043_第3頁
ICS計(jì)算機(jī)基礎(chǔ)教學(xué)課件第二章習(xí)題答案202307062317199297043_第4頁
ICS計(jì)算機(jī)基礎(chǔ)教學(xué)課件第二章習(xí)題答案202307062317199297043_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章習(xí)題答案1.給出以下概念的解釋說明。真值機(jī)器數(shù)原碼數(shù)值數(shù)據(jù)非數(shù)值數(shù)據(jù)變形補(bǔ)碼移碼無符號整數(shù)帶符號整數(shù)浮點(diǎn)數(shù)定點(diǎn)數(shù)尾數(shù)補(bǔ)碼階碼右規(guī)溢出階階碼下溢機(jī)器零階碼上溢非數(shù)(NaN)規(guī)格化數(shù)BCD碼大端方式左規(guī)非規(guī)格化數(shù)邏輯數(shù)小端方式ASCII碼漢字輸入碼漢字內(nèi)碼機(jī)器字長最高有效位掩碼最高有效字節(jié)(MSB)最低有效位最低有效字節(jié)(LSB)算術(shù)移位邏輯移位0擴(kuò)展符號擴(kuò)展零標(biāo)志ZF溢出標(biāo)志OF符號標(biāo)志SF進(jìn)位/借位標(biāo)志CF2.簡單回答下列問題。(1)為什么計(jì)算機(jī)內(nèi)部采用二進(jìn)制表示信息?既然計(jì)算機(jī)內(nèi)部所有信息都用二進(jìn)制表示,為什么還要用到十六進(jìn)制或八進(jìn)制數(shù)?(2)常用的定點(diǎn)數(shù)編碼方式有哪幾種?通常它們各自用來表示什么?(3)為什么現(xiàn)代計(jì)算機(jī)中大多用補(bǔ)碼表示帶符號整數(shù)?(4)在浮點(diǎn)數(shù)的基數(shù)和總位數(shù)一定的情況下,浮點(diǎn)數(shù)的表示范圍和精度分別由什么決定?兩者如何相互制約?(5)為什么要對浮點(diǎn)數(shù)進(jìn)行規(guī)格化?有哪兩種規(guī)格化操作?(6)為什么有些計(jì)算機(jī)中除了用二進(jìn)制外還用BCD碼來表示數(shù)值數(shù)據(jù)?(7)為什么計(jì)算機(jī)處理漢字時(shí)會涉及到不同的編碼(如,輸入碼、內(nèi)碼、字模碼)?說明這些編碼中哪些用二進(jìn)制編碼,哪些不用二進(jìn)制編碼,為什么?3.實(shí)現(xiàn)下列各數(shù)的轉(zhuǎn)換。(1)(25.8125)10=(?)2=(?)8=(?)16(2)(101101.011)2=(?)10=(?)8=(?)16=(?)8421(3)(010110010110.0011)8421=(?)10=(?)2=(?)16(4)(4E.C)16=(?)10=(?)2參考答案:(1)(25.8125)10=(11001.1101)2=(31.64)8=(19.D)16(2)(101101.011)2=(45.375)10=(55.3)8=(2D.6)16=(01000101.001101110101)8421(3)(010110010110.0011)8421=(596.3)10=(1001010100.01001100110011…)2=(254.4CCC…)16(4)(4E.C)16=(78.75)10=(01001110.11)24.假定機(jī)器數(shù)為8位(1位符號,7位數(shù)值),寫出下列各二進(jìn)制數(shù)的原碼表示。+0.1001,–0.1001,+1.0,–1.0,+0.010100,–0.010100,+0,–0參考答案:(后面添0)+0.1001:–0.1001:+1.0:原碼0.10010001.1001000溢出–1.0:溢出+0.010100:–0.010100:+0:0.01010001.01010000.00000001.0000000–0:

5.假定機(jī)器數(shù)為8位(1位符號,7位數(shù)值),寫出下列各二進(jìn)制數(shù)的補(bǔ)碼和移碼表示。+1001,–1001,+1,–1,+10100,–10100,+0,–0參考答案:(假定移碼的偏置常數(shù)為128)(前面添0)+1001:移碼補(bǔ)碼100010010111011110000001011111111100101000110110010000000100000000000100111110111000000011111111100010100111011000000000000000000–1001:+1:–1:+10100:–10100:+0:–0:6.已知[x]補(bǔ),求x(1)[x]補(bǔ)=11100111參考答案:(1)[x]補(bǔ)=11100111(2)[x]補(bǔ)=10000000(3)[x]補(bǔ)=01010010(4)[x]補(bǔ)=11010011(2)[x]補(bǔ)=10000000(3)[x]補(bǔ)=01010010(4)[x]補(bǔ)=11010011x=–0011001B=–25x=–10000000B=–128x=+1010010B=82x=–0101101B=–457.某32位字長的機(jī)器中帶符號整數(shù)用補(bǔ)碼表示,浮點(diǎn)數(shù)用IEEE754標(biāo)準(zhǔn)表示,寄存器R1和R2的內(nèi)容分別為R1:0000108BH,R2:8080108BH。不同指令對寄存器進(jìn)行不同的操作,因而不同指令執(zhí)行時(shí)寄存器內(nèi)容對應(yīng)的真值不同。假定執(zhí)行下列運(yùn)算指令時(shí),操作數(shù)為寄存器R1和R2的內(nèi)容,則R1和R2中操作數(shù)的真值分別為多少?(1)無符號整數(shù)加法指令(2)帶符號整數(shù)乘法指令(3)單精度浮點(diǎn)數(shù)減法指令參考答案:R1=0000108BH=00000000000000000001000010001011BR2=8080108BH=10000000100000000001000010001011B(1)對于無符號數(shù)加法指令,R1和R2中是操作數(shù)的無符號數(shù)表示,因此,其真值分別為R1:108BH,R2:8080108BH。(2)對于帶符號整數(shù)乘法指令,R1和R2中是操作數(shù)的帶符號整數(shù),即補(bǔ)碼表示,由最高位可知,R1為正數(shù),R2為負(fù)數(shù)。R1的真值為+108BH,R2的真值為–(1111111011111111110111101110100b+1b)=–7F7FEF75H。(3)對于單精度浮點(diǎn)數(shù)減法指令,R1和R2中是操作數(shù)的IEEE754單精度浮點(diǎn)數(shù)表示。在IEEE754標(biāo)準(zhǔn)中,單精度浮點(diǎn)數(shù)的位數(shù)為32位,其中包含1位符號位,8位階碼,23位尾數(shù)。由R1中的內(nèi)容可知,其符號位為0,說明為正數(shù),階碼為00000000,尾數(shù)部分為00000000001000010001011,故其為非規(guī)格化浮點(diǎn)數(shù),指數(shù)為–126,尾數(shù)中沒有隱藏的1,用十六進(jìn)制表示尾數(shù)為+0.002116H,故R1表示的真值為+0.002116H×2-126。由R2中的內(nèi)容可知,其符號位為1,表示其為負(fù)數(shù),階碼為00000001,尾數(shù)部分為00000000001000010001011,故其為規(guī)格化浮點(diǎn)數(shù),指數(shù)為1–127=–126,尾數(shù)中有隱藏的1,用十六進(jìn)制表示尾數(shù)為–1.002116H,故R2表示的真值為–1.002116H×2-1268.假定機(jī)器M的字長為32位,用補(bǔ)碼表示帶符號整數(shù)。表2.12中第一列給出了在機(jī)器M上執(zhí)行的C

語言程序中的關(guān)系表達(dá)式,請參照已有的表欄內(nèi)容完成表中后三欄內(nèi)容的填寫。表2.12題8用表關(guān)系表達(dá)式運(yùn)算類型結(jié)果說明0==0U–1<0–1<0U無符號整數(shù)有符號整數(shù)0111…1B(232–1)>00…0B(0)2147483647>–2147483647–12147483647U>–2147483647–12147483647>(int)2147483648U–1>–2011…1B(231–1)>100…0B(–231)(unsigned)–1>–2參考答案:關(guān)系表達(dá)式運(yùn)算類型結(jié)果說明0==0U無符號整數(shù)有符號整數(shù)無符號整數(shù)有符號整數(shù)無符號整數(shù)有符號整數(shù)有符號整數(shù)無符號整數(shù)1101011100…0B=00…0B–1<011…1B(–1)<00…0B(0)–1<0U11…1B(232–1)>00…0B(0)–1)>100…0B(–2–1)<100…0B(22147483647>–2147483647–12147483647U>–2147483647–12147483647>(int)2147483648U–1>–2011…1B(2011…1B(2011…1B(23131)313131)–1)>100…0B(–2)3111…1B(–1)>11…10B(–2)11…1B(2–1)>11…10B(2–2)32(unsigned)–1>–2329.在32位計(jì)算機(jī)中運(yùn)行一個(gè)C語言程序,在該程序中出現(xiàn)了以下變量的初值,請寫出它們對應(yīng)的機(jī)器數(shù)(用十六進(jìn)制表示)。(1)intx=-32768(4)charc=?@?參考答案:(2)shorty=522(5)floata=-1.1(3)unsignedz=65530(6)doubleb=10.5(1)-215=-1000000000000000B,故機(jī)器數(shù)為1?11000000000000000=FFFF8000H(2)522=1000001010B,故機(jī)器數(shù)為0000001000001010=020AH(3)65530=216-1-5=1111111111111010B,故機(jī)器數(shù)為0000FFFAH(4)?@?的ASCII碼是40H(5)-1.1=-1.00011[0011]?B=-1.00011001100110011001100B,階碼為127+0=01111111,故機(jī)器數(shù)為10111111100011001100110011001100=BF8CCCCCH(6)10.5=1010.1B=1.0101B23,階碼為1023+3=10000000010,故機(jī)器數(shù)為0100000000100101[0000]=4025000000000000H10.在32位計(jì)算機(jī)中運(yùn)行一個(gè)C語言程序,在該程序中出現(xiàn)了一些變量,已知這些變量在某一時(shí)刻的機(jī)器數(shù)(用十六進(jìn)制表示)如下,請寫出它們對應(yīng)的真值。(1)intx:FFFF0006H(4)charc:2AH參考答案:(2)shorty:DFFCH5)floata:C4480000H(3)unsignedz:FFFFFFFAH(6)doubleb:C024800000000000H(1)FFFF0006H=1?10000000000000110B,故x=-1111111111111010B=-(65535-5)=-65530(2)DFFCH=1101111111111100B=-010000000000100B

故y=-(8192+4)=-8196(3)FFFFFFFAH=1?11010B,故z=232-6(4)2AH=00101010B,故c=42,若c表示字符,則c為字符?*?(5)C4480000H=11000100010010000?0B,階碼為10001000,階為136-127=9,尾數(shù)為-1.1001B,故a=-1.1001B29=-1100100000B=-800(6)C024800000000000H=1100000000100100100000?0B,階碼為10000000010,階為1026-1023=3,尾數(shù)為1.01001B,故b=-1.01001B23=-1010.01B=-10.2511.以下給出的是一些字符串變量在內(nèi)存中存放的字符串機(jī)器碼,請根據(jù)ASCII碼定義寫出對應(yīng)的字符串。指出代碼0AH和00H對應(yīng)的字符的含義。(1)char*mystring1:68H65H6CH6CH6FH2CH77H6FH72H6CH64H0AH00H(2)char*mystring2:77H65H20H61H72H65H20H68H61H70H70H79H21H00H參考答案:字符串由字符組成,每個(gè)字符在內(nèi)存中存放的是對應(yīng)的ASCII碼,因而可根據(jù)表2.5中的ASCII碼和字符之間的對應(yīng)關(guān)系寫出字符串。(1)mystring1指向的字符串為:hello,world\n(2)mystring2指向的字符串為:wearehappy!其中,ASCII碼00001010B=0AH對應(yīng)的是“換行”字符?\n?(LF)。每個(gè)字符串在內(nèi)存存放時(shí)最后都會有一個(gè)“空”字符?\0?(NUL),其ASCII碼為00H。12.以下給出的是一些字符串變量的初值,請寫出對應(yīng)的機(jī)器碼。(1)char*mystring1="./myfile"(2)char*mystring2="OK,good!"參考答案:(1)mysring1指向的存儲區(qū)存放內(nèi)容為:2EH2FH6DH79H66H69H6CH65H00H(2)mysring2指向的存儲區(qū)存放內(nèi)容為:4FH4BH2CH67H6FH6FH64H21H00H13.已知C語言中的按位異或運(yùn)算(“XOR”)用符號“^”表示。對于任意一個(gè)位序列a,a^a=0,C語言程序可以利用這個(gè)特性來實(shí)現(xiàn)兩個(gè)數(shù)值交換的功能。以下是一個(gè)實(shí)現(xiàn)該功能的C語言函數(shù):123456voidxor_swap(int*x,int*y){*y=*x^*y;/*第一步*/*x=*x^*y;/*第二步*/*y=*x^*y;/*第三步*/}假定執(zhí)行該函數(shù)時(shí)*x和*y的初始值分別為a和b,即*x=a且*y=b,請給出每一步執(zhí)行結(jié)束后,x和y各自指向的內(nèi)存單元中的內(nèi)容分別是什么?參考答案:第一步結(jié)束后,x和y指向的內(nèi)存單元內(nèi)容各為a和a^b第二步結(jié)束后,x和y指向的內(nèi)存單元內(nèi)容各為b和a^b第三步結(jié)束后,x和y指向的內(nèi)存單元內(nèi)容各為b和a14.假定某個(gè)實(shí)現(xiàn)數(shù)組元素倒置的函數(shù)reverse_array調(diào)用了第13題中給出的xor_swap函數(shù):1voidreverse_array(inta[],intlen)2{3456intleft,right=len-1;for(left=0;left<=right;left++,right--)xor_swap(&a[left],&a[right]);}

當(dāng)len為偶數(shù)時(shí),reverse_array函數(shù)的執(zhí)行沒有問題。但是,當(dāng)len為奇數(shù)時(shí),函數(shù)的執(zhí)行結(jié)果不正確。請問,當(dāng)len為奇數(shù)時(shí)會出現(xiàn)什么問題?最后一次循環(huán)中的left和right各取什么值?最后一次循環(huán)中調(diào)用xor_swap函數(shù)后的返回值是什么?對reverse_array函數(shù)作怎樣的改動就可消除該問題?參考答案:當(dāng)len為奇數(shù)時(shí),最后一次循環(huán)執(zhí)行的是將最中間的數(shù)與自己進(jìn)行交換,即left和right都指向最中間數(shù)組元素,因而在調(diào)用xor_swap函數(shù)過程中的每一步執(zhí)行*x^*y時(shí)結(jié)果都是0,并將0寫入到了最中間的數(shù)組元素,從而改變了原來的數(shù)值。可以將for循環(huán)中的終止條件改為“l(fā)eft<right”,這樣,在len為奇數(shù)時(shí)最中間的數(shù)組元素不動。15.假設(shè)以下表2.13中的x和y是某C語言程序中的char型變量,請根據(jù)C語言中的按位運(yùn)算和邏輯運(yùn)算的定義,填寫表2.13,要求用十六進(jìn)制形式填寫。表2.13題15用表xyx^yx&yx|y~x|~yx&!yx&&yx||y!x||!yx&&~y0x5F0xC70x800x070xA00xF00x7F0x55參考答案:表2.13題15用表xyx^y0xFF0x370xFF0x07x&y0x000xC00x000x07x|y~x|~y0xFF0x3F0xFF0xF8x&!y0x000x000x000x00x&&y0x010x010x010x01x||y0x010x010x010x01!x||!y0x000x000x000x00x&&~y0x010x5F0xC70x800x070xA00xF00x7F0xFF0xFF0xF70xFF0xFF0x010x010x0016.對于一個(gè)n(n≥8)位的變量x,請根據(jù)C語言中按位運(yùn)算的定義,寫出滿足下列要求的C語言表達(dá)式。(1)x的最高有效字節(jié)不變,其余各位全變?yōu)?。(2)x的最低有效字節(jié)不變,其余各位全變?yōu)?。(3)x的最低有效字節(jié)全變?yōu)?,其余各位取反。(4)x的最低有效字節(jié)全變1,其余各位不變。參考答案:(1)(x>>(n-8))<<(n-8)(2)x&0xFF(3)((x^~0xFF)>>8)<<8(3)x|0xFF17.以下是一個(gè)由反匯編器生成的一段針對某個(gè)小端方式處理器的機(jī)器級代碼表示文本,其中,最左邊是指令所在的存儲單元地址,冒號后面是指令的機(jī)器碼,最右邊是指令的匯編語言表示,即匯編指令。已知反匯編輸出中的機(jī)器數(shù)都采用補(bǔ)碼表示,請給出指令代碼中劃線部分表示的機(jī)器數(shù)對應(yīng)的真值。80483d2:81ecb801000080483d8:8b5508sub&0x1b8,%espmov0x8(%ebp),%edx80483db:83c214addmovadd$0x14,%edx0xfffffe58(%ebp),%eax(%edx),%eax80483de:8b8558feffff80483e4:030280483e6:898574feffffmov%eax,0xfffffe74(%ebp)

80483ec:8b550880483ef:83c24480483f2:8b85c8feffff80483f8:8902mov0x8(%ebp),%edxadd$0x44,%edxmovmov0xfffffec8(%ebp),%eax%eax,(%edx)80483fa:8b451080483fd:03450c8048400:8985ecfeffff8048406:8b45088048409:83c020參考答案:mov0x10(%ebp),%eaxaddmov0xc(%ebp),%eax%eax,0xfffffeec(%ebp)mov0x8(%ebp),%eaxadd$0x20,%eaxb8010000:機(jī)器數(shù)為000001B8H,真值為+110111000B=44014:機(jī)器數(shù)為14H,真值為+10100B=2058feffff:機(jī)器數(shù)為FFFFFE58H,真值為-110101000B=-42474feffff:機(jī)器數(shù)為FFFFFE74H,真值為-110001100B=-39644:機(jī)器數(shù)為44H,真值為+1000100B=68c8feffff:機(jī)器數(shù)為FFFFFEC8H,真值為-110001100B=-31210:機(jī)器數(shù)為10H,真值為+10000B=160c:機(jī)器數(shù)為0CH,真值為+1100B=12ecfeffff:機(jī)器數(shù)為FFFFFEECH,真值為-100010100B=-27620:機(jī)器數(shù)為20H,真值為+00100000B=3218.假設(shè)以下C語言函數(shù)compare_str_len用來判斷兩個(gè)字符串的長度,當(dāng)字符串str1的長度大于str2的長度時(shí)函數(shù)返回值為1,否則為0。123intcompare_str_len(char*str1,char*str2){returnstrlen(str1)-strlen(str2)>0;4}已知C語言標(biāo)準(zhǔn)庫函數(shù)strlen原型聲明為“size_tstrlen(constchar*s);”,其中,size_t被定義為unsignedint類型。請問:函數(shù)compare_str_len在什么情況下返回的結(jié)果不正確?為什么?為使函數(shù)正確返回結(jié)果應(yīng)如何修改代碼?參考答案:因?yàn)閟ize_t被定義為unsignedint類型,因此,庫函數(shù)strlen的返回值為無符號整數(shù)。函數(shù)compare_str_len中的返回值是strlen(str1)-strlen(str2)>0,這個(gè)關(guān)系表達(dá)式中>號左邊是兩個(gè)無符號數(shù)相減,其差還是無符號整數(shù),因而總是大于等于0,也即在str1的長度小于str2的長度時(shí)結(jié)果也為1。顯然,這是錯(cuò)誤的。只要將第3行語句改為以下形式即可:3returnstrlen(str1)>strlen(str2);19.考慮以下C語言程序代碼:12345678intfunc1(unsignedword){return(int)((word<<24)>>24);}intfunc2(unsignedword){return((int)word<<24)>>24;}假設(shè)在一個(gè)32位機(jī)器上執(zhí)行這些函數(shù),該機(jī)器使用二進(jìn)制補(bǔ)碼表示帶符號整數(shù)。無符號數(shù)采用邏輯移位,帶符號整數(shù)采用算術(shù)移位。請?zhí)顚懕?.14,并說明函數(shù)func1和func2的功能。表2.14題19用表wfunc1(w)func2(w)

機(jī)器數(shù)值機(jī)器數(shù)值機(jī)器數(shù)值127128255256參考答案:函數(shù)func1的功能是把無符號數(shù)高24位清零(左移24位再邏輯右移24位),當(dāng)成帶符號整數(shù)返回時(shí),結(jié)果一定是正數(shù);函數(shù)func2的功能是把無符號數(shù)的高24位都變成和第25位一樣,因?yàn)樽笠?4位后進(jìn)行算術(shù)右移,高24位補(bǔ)符號位(即第25位),當(dāng)成帶符號整數(shù)返回時(shí),結(jié)果可能是正數(shù)也可能是負(fù)數(shù)。Wfunc1(w)func2(w)機(jī)器數(shù)值機(jī)器數(shù)值+127+128+2550機(jī)器數(shù)值+127–128–10000007FH00000080H000000FFH00000100H1271282552560000007FH00000080H000000FFH00000000H0000007FHFFFFFF80HFFFFFFFFH00000000H020.填寫表2.15,注意對比無符號整數(shù)和帶符號整數(shù)的乘法結(jié)果,以及截?cái)嗖僮髑?、后的結(jié)果。表2.15題20用表xyx×y(截?cái)嗲埃﹛×y(截?cái)嗪螅┠J綑C(jī)器數(shù)值機(jī)器數(shù)值機(jī)器數(shù)值機(jī)器數(shù)值無符號帶符號無符號帶符號無符號帶符號110110001001111111010010111111111111參考答案:xyx×y(截?cái)嗲埃﹛×y(截?cái)嗪螅┠J綑C(jī)器數(shù)110值6機(jī)器數(shù)010值2機(jī)器數(shù)值12–47機(jī)器數(shù)100值4無符號數(shù)二進(jìn)制補(bǔ)碼無符號數(shù)001100111100000111111111110001000001110–21010+27100–47001111111二進(jìn)制補(bǔ)碼無符號數(shù)001+17111–17–149+1111–11111111001二進(jìn)制補(bǔ)碼111–1111–1001+121.以下是兩段C語言代碼,函數(shù)arith()是直接用C語言寫的,而optarith()是對arith()函數(shù)以某個(gè)確定的M和N編譯生成的機(jī)器代碼反編譯生成的。根據(jù)optarith(),可以推斷函數(shù)arith()中M和N的值各是多少?#defineM

#defineNint{arith(intx,inty)intresult=0;result=x*M+y/N;returnresult;}intoptarith(intx,inty){intt=x;x<<=4;x–=t;if(y<0)y+=3;y=>>2;returnx+y;}參考答案:可以看出x*M和“intt=x;x<<=4;x-=t;”三句對應(yīng),這些語句實(shí)現(xiàn)了x乘15的功能(左移4位相當(dāng)于乘以16,然后再減1),因此,M等于15;y/N與“if(y<0)y+=3;y>>2;”兩句對應(yīng),第二句“y右移2位”實(shí)現(xiàn)了y除以4的功能,因此N是4。而第一句“if(y<0)y+=3;”主要用于對y=–1時(shí)進(jìn)行調(diào)整,若不調(diào)整,則–1>>2=–1而–1/4=0,兩者不等;調(diào)整后–1+3=2,2>>2=0,兩者相等。22.下列幾種情況所能表示的數(shù)的范圍是什么?(1)16位無符號整數(shù)(2)16位補(bǔ)碼表示的帶符號整數(shù)(3)下述格式的浮點(diǎn)數(shù)(基數(shù)為2,移碼的偏置常數(shù)為128)數(shù)符1位階碼尾數(shù)8位移碼7位原碼數(shù)值部分參考答案:(1)16位無符號整數(shù):0~65535(2)16位補(bǔ)碼表示的整數(shù):–32768~+32767(3)浮點(diǎn)數(shù):負(fù)數(shù):–(1–2–7)×2+127~–2–7×2–128正數(shù):+2–7×2–128~(1–2–7)×2+12723.以IEEE754單精度浮點(diǎn)數(shù)格式表示下列十進(jìn)制數(shù)。+1.75,+19,–1/8,258參考答案:+1.75=+1.11B=1.11B×20,故階碼為0+127=01111111B,數(shù)符為0,尾數(shù)為1.110…0,小數(shù)點(diǎn)前為隱藏位,所以+1.7表示為00111111111000000000000000000000,用十六進(jìn)制表示為3FE00000H。+19=+10011B=+1.0011B×24,故階碼為4+127=10000011B,數(shù)符為0,尾數(shù)為1.00110…0,所以+19表示為01000001100110000000000000000000,用十六進(jìn)制表示為41980000H。–1/8=–0.125=–0.001B=–1.0×2–3,階碼為–3+127=01111100B,數(shù)符為1,尾數(shù)為1.0…0,所以–1/8表示為10111110000000000000000000000000,用十六進(jìn)制表示為BE000000H。258=100000010B=1.0000001B×28,故階碼為8+127=10000111B,數(shù)符為0,尾數(shù)為1.0000001,所以

258表示為01000011100000010000000000000000,用十六進(jìn)制表示為43810000H。24.設(shè)一個(gè)變量的值為4098,要求分別用32位補(bǔ)碼整數(shù)和IEEE754單精度浮點(diǎn)格式表示該變量(結(jié)果用十六進(jìn)制形式表示),并說明哪段二進(jìn)制位序列在兩種表示中完全相同,為什么會相同?參考答案:4098=+1000000000010B=+1.00000000001×21232位2-補(bǔ)碼形式為:00000000000000000001000000000010(00001002H)IEEE754單精度格式為:01000101100000000001000000000000(45801000H)粗體部分為除隱藏位外的有效數(shù)字,因此,在兩種表示中是相同的位序列。25.設(shè)一個(gè)變量的值為–2147483647(提示:2147483647=231-1),要求分別用32位補(bǔ)碼整數(shù)和IEEE754單精度浮點(diǎn)格式表示該變量(結(jié)果用十六進(jìn)制形式表示),并說明哪種表示其值完全精確,哪種表示的是近似值。參考答案:–2147483647=–1111111111111111111111111111111B=–1.111111111111111111111111111111×23032位補(bǔ)碼形式為:10000000000000000000000000000001(80000001H)IEEE754單精度格式為:11001110111111111111111111111111(CEFFFFFFH)32位補(bǔ)碼形式能表示精確的值,而浮點(diǎn)數(shù)表示的是近似值,因?yàn)榈?位被截?cái)嗔恕?6.下表給出了有關(guān)IEEE754浮點(diǎn)格式表示中一些重要的非負(fù)數(shù)的取值,表中已經(jīng)有最大規(guī)格化數(shù)的相應(yīng)內(nèi)容,要求填入其他浮點(diǎn)數(shù)格式的相應(yīng)內(nèi)容。表2.16題26用表單精度雙精度項(xiàng)目階碼尾數(shù)以2的冪次表示的值以10的冪次表示的值以2的冪次表示的值以10的冪次表示的值01最大規(guī)格化數(shù)111111101…11(2–2-23)×21273.4×1038(2–2-52)×210231.8×10308最小規(guī)格化數(shù)最大非規(guī)格化數(shù)最小非規(guī)格化數(shù)+∞NaN參考答案:表2.16題26用表單精度雙精度項(xiàng)目階碼尾數(shù)以2的冪次表示的值以10的冪次表示的值以2的冪次表示的值以10的冪次表示的值0000000000111111111111110000000010000000000000000111111110?000?001?110?001?110?010?00010101011最大規(guī)格化數(shù)(2–2-23)×21273.4×1038(2–2-52)×210231.8×10308最小規(guī)格化數(shù)最大非規(guī)格化數(shù)最小非規(guī)格化數(shù)+∞1.0×2–126(1–2–23)×2–1261.2×10–381.2×10–381.4×10–451.0×2–10222.2×10–3082.2×10–3084.9×10–324(1–2–52)×2–10222–23×2–126=2–1492–52×2–1022––––

NaN11111111非全0––––27.已知下列字符編碼:A為1000001,a為1100001,0為0110000,求E、e、f、7、G、Z、5的7位ACSII碼和在第一位前加入奇校驗(yàn)位后的8位編碼。參考答案:E的ASCII碼為?A?+(?E?–?A?)=1000001+100=1000101,奇校驗(yàn)位P=0,第一位前加入奇校驗(yàn)位后的8位編碼是01000101。e的ASCII碼為?a?+(?e?–?a?)=1100001+100=1100101,奇校驗(yàn)位P=1,第一位前加入奇校驗(yàn)位后的8位編碼是11100101。f的ASCII碼為?a?+(?f?–?a?)=1100001+101=1100110,奇校驗(yàn)位P=1,第一位前加入奇校驗(yàn)位后的8位編碼是11100110。7的ASCII碼為?0?+(7-0)=0110000+111=0110111,奇校驗(yàn)位P=0,第一位前加入奇校驗(yàn)位后的8位編碼是00110111。G的ASCII碼為?A?+(?G?–?A?)=1000001+0110=1000111,奇校驗(yàn)位P=1,第一位前加入奇校驗(yàn)位后的8位編碼是11000111。Z的ASCII碼為?A’+(?Z?–?A?)=1000001+11001=1011010,奇校驗(yàn)位P=1,第一位前加入奇校驗(yàn)位后的8位編碼是11011010。5的ASCII碼為?0?+(5–0)=0110000+101=0110101,奇校驗(yàn)位P=1,第一位前加入奇校驗(yàn)位后的8位編碼是10110101。28.假定在一個(gè)程序中定義了變量x、y和i,其中,x和y是float型變量(用IEEE754單精度浮點(diǎn)數(shù)表示),i是16位short型變量(用補(bǔ)碼表示)。程序執(zhí)行到某一時(shí)刻,x=–0.125、y=7.5、i=100,它們都被寫到了主存(按字節(jié)編址),其地址分別是100,108和112。請分別畫出在大端機(jī)器和小端機(jī)器上變量x、y和i中每個(gè)字節(jié)在主存的存放位置。參考答案:–0.125=–0.001B=–1.0×2-3x在機(jī)器內(nèi)部的機(jī)器數(shù)為:17.5=+111.1B=+1.111×22y在機(jī)器內(nèi)部的機(jī)器數(shù)為:0100=64+32+4=1100100B011111001000000100…0(BE000000H)11100…0(40F00000H)i在機(jī)器內(nèi)部表示的機(jī)器數(shù)為:0000000001100100(0064H)大端機(jī)內(nèi)容BEH00H00H00H40HF0H00H00H00H64H小端機(jī)地址100101102103108109110111內(nèi)容00H00H00HBEH00H00HF0H40H64H00H11211329.對于圖2.6,假設(shè)n=8,機(jī)器數(shù)X和Y的真值分別是x和y。請按照圖2.6的功能填寫表2.17,并給出對每個(gè)結(jié)果的解釋。要求機(jī)器數(shù)用十六進(jìn)制形式填寫,真值用十進(jìn)制形式填寫。表2.17題29用表

表示XxYyX+Yx+yOFSFCFX-Yx-yOFSFCF無符號帶符號無符號帶符號0xB00x8C0xB00x7E0x7E0x8C0x5D0x5D參考答案:表2.17題29用表表示XxYyX+Yx+yOF1SF0CF1X-Y0x240x24x-y36OF0SF0CF0無符號帶符號0xB00xB01760x8C1400x3C60-800x8C-1160x3C6010136000無符號帶符號0x7E0x7E1261260x5D0x5D93930xDB0xDB219-371111000x210x213333000000(1)無符號整數(shù)176+140=316,無法用8位表示,即結(jié)果應(yīng)有進(jìn)位,CF應(yīng)為1。驗(yàn)證正確。(2)無符號整數(shù)176-140=36,可用8位表示,即結(jié)果沒有進(jìn)位,CF應(yīng)為0。驗(yàn)證正確。(3)帶符號整數(shù)-80+(-116)=-316,無法用8位表示,即結(jié)果溢出,OF應(yīng)為1。驗(yàn)證正確。(4)帶符號整數(shù)-80-(-116)=36,可用8位表示,即結(jié)果不溢出,OF應(yīng)為0。驗(yàn)證正確。(5)無符號整數(shù)126+93=219,可用8位表示,即結(jié)果沒有進(jìn)位,CF應(yīng)為0。驗(yàn)證正確。(6)無符號整數(shù)126-93=33,可用8位表示,即結(jié)果沒有進(jìn)位,CF應(yīng)為0。驗(yàn)證正確。(7)帶符號整數(shù)126+93=219,無法用8位表示,即結(jié)果溢出,OF應(yīng)為1。驗(yàn)證正確。(8)帶符號整數(shù)126-93=33,可用8位表示,即結(jié)果不溢出,OF應(yīng)為0。驗(yàn)證正確。無符號整數(shù)的加減運(yùn)算的結(jié)果是否溢出,通過進(jìn)位/借位標(biāo)志CF來判斷,而帶符號整數(shù)的加減運(yùn)算結(jié)果是否溢出,通過溢出標(biāo)志OF來判斷。30.在字長為32位的計(jì)算機(jī)上,有一個(gè)函數(shù)其原型聲明為“intch_mul_overflow(intx,inty);”,該函數(shù)用于對兩個(gè)int型變量x和y的乘積判斷是否溢出,若溢出則返回1,否則返回0。請使用64位精度的整數(shù)類型longlong來編寫該函數(shù)。參考答案:使用64位精度的乘法實(shí)現(xiàn)兩個(gè)32位帶符號整數(shù)相乘(專門的補(bǔ)碼乘法運(yùn)算),可以通過乘積的高32位和低32位的關(guān)系來進(jìn)行溢出判斷。判斷規(guī)則是:若高32位中每一位都與低32位的最高位相同,則不溢出;否則溢出。1234intch_mul_overflow(intx,inty){longlongprod_64=(longlong)x*y;returnprod_64!=(int)prod_64;5}第3行賦值語句的右邊采用強(qiáng)制類型轉(zhuǎn)換,使得x和y相乘的結(jié)果強(qiáng)制以64位乘積的形式保留在64位longlong型變量prod_64中。在第4行關(guān)系運(yùn)算符!=右邊的強(qiáng)制類型轉(zhuǎn)換,將一個(gè)64位乘積的高32位丟棄,然后,在進(jìn)行關(guān)系運(yùn)算時(shí),因?yàn)殛P(guān)系運(yùn)算符!=的左邊是一個(gè)64位整數(shù),所以,右邊的32位數(shù)必須再進(jìn)行符號擴(kuò)展以轉(zhuǎn)換為64位整數(shù),然后再與左邊的整數(shù)進(jìn)行比較。若乘積沒有溢出,則丟棄的高32位和后面符號擴(kuò)展的32位相同,因而比較結(jié)果一定是相等,返回為0;若乘積有溢出,則比較結(jié)果一定不相等,返回為1。若第3行賦值語句改成如下形式,則prod_64得到的是低32位乘積進(jìn)行符號擴(kuò)展后的64位值,因此,當(dāng)結(jié)果溢出時(shí),prod_64中得到的并不是正確的64位乘積。

3longlongprod_64=x*y;31.對于第2.7.5節(jié)中例2.31存在的整數(shù)溢出漏洞,如果將其中的第5行改為以下兩個(gè)語句:unsignedlonglongarraysize=count*(unsignedlonglong)sizeof(int);int*myarray=(int*)malloc(arraysize);已知C語言標(biāo)準(zhǔn)庫函數(shù)malloc的原型聲明為“void*malloc(size_tsize);”,其中,size_t定義為unsignedint類型,則上述改動能否消除整數(shù)溢出漏洞?若能則說明理由;若不能則給出修改方案。參考答案:上述改動無法消除整數(shù)溢出漏洞,這種改動方式雖然使得arraysize的表示范圍擴(kuò)大了,避免了arraysize的溢出,不過,當(dāng)調(diào)用malloc函數(shù)時(shí),若arraysize的值大于32位的unsignedint的最大可表示值,則malloc函數(shù)還是只能按32位數(shù)給出的值去申請空間,同樣會發(fā)生整數(shù)溢出漏洞。程序應(yīng)該在調(diào)用malloc函數(shù)之前檢測所申請的空間大小是否大于32位無符號整數(shù)的可表示范圍,若是,則返回-1,表示不成功;否則再申請空間并繼續(xù)進(jìn)行數(shù)組復(fù)制。修改后的程序如下:1/*復(fù)制數(shù)組到堆中,count為數(shù)組元素個(gè)數(shù)*/2intcopy_array(int*array,intcount){3inti;4/*在堆區(qū)申請一塊內(nèi)存*/5unsignedlonglongarraysize=count*(unsignedlonglong)sizeof(int);size_tmyarraysize=(size_t)arraysize;if(myarraysize!=arraysize)return-1;6789int*myarray=(int*)malloc(myarraysize);if(myarray==NULL)101112131415}return-1;for(i=0;i<count;i++)myarray[i]=array[i];returncount;32.已知一次整數(shù)加法、一次整數(shù)減法和一次移位操作都只需一個(gè)時(shí)鐘周期,一次整數(shù)乘法操作需要10個(gè)時(shí)鐘周期。若x為一個(gè)整型變量,現(xiàn)要計(jì)算55*x,請給出一種計(jì)算表達(dá)式,使得所用時(shí)鐘周期數(shù)最少。參考答案:55*x=(64-8-1)*x=64*x-8*x-x根據(jù)上述表達(dá)式,只要兩次移位操作和兩次減法操作,共4個(gè)時(shí)鐘周期。若將55分解為32+16+4+2+1,則需要4次移位操作和4次加法操作,共8個(gè)時(shí)鐘周期。上述兩種方式都比直接執(zhí)行一次乘法操作所用的時(shí)鐘周期數(shù)少。33.假設(shè)x為一個(gè)int型變量,請給出一個(gè)用來計(jì)算x/32的值的函數(shù)div32。要求不能使用除法、乘法、模運(yùn)算、比較運(yùn)算、循環(huán)語句和條件語句,可以使用右移、加法以及任何按位運(yùn)算。參考答案:根據(jù)第2.7.6節(jié)內(nèi)容可知,帶符號整數(shù)x除以2k的值可以用移位方式實(shí)現(xiàn)。若x為正數(shù),則將x右移k位得到商;若x為負(fù)數(shù),則x需要加一個(gè)偏移量(2k-1)后再右移k位得到商。因此,在執(zhí)行右移操作前必須先計(jì)算偏移量,計(jì)算公式如下:

0x>=0x<0b=31x的符號位在最左邊,因此,表達(dá)式x>>31的計(jì)算結(jié)果得到32個(gè)符號位,x小于0時(shí)為32個(gè)1,否則為32個(gè)0。偏移量b可以通過用掩碼的方式得到。函數(shù)div32的C語言源代碼如下:intdiv32(intx){/*根據(jù)x的符號得到偏移量b*/intb=(x>>31)&0x1F;return(x+b)>>5;}34.無符號整數(shù)變量ux和uy的聲明和初始化如下:unsignedux=x;unsigneduy=y;若sizeof(int)=4,則對于任意int型變量x和y,判斷以下關(guān)系表達(dá)式是否永真。若永真則給出證明;若不永真則給出結(jié)果為假時(shí)x和y的取值。(1)(x*x)>=0(2)(x-1<0)||x>0(3)x<0||-x<=0(4)x>0||-x>=0(5)x&0xf!=15||(x<<28)<0(7)~x+~y==~(x+y)(9)((x>>2)<<2)<=x(11)x/4+y/8==(x>>2)+(y>>3)(13)x+y==ux+uy參考答案:(6)x>y==(-x<-y)(8)(int)(ux-uy)==-(y-x)(10)x*4+y*8==(x<<2)+(y<<3)(12)x*y==ux*uy(14)x*~y+ux*uy==-x(1)(x*x)>=0非永真。例如,x=65534時(shí),則x*x=(216-2)*(216-2)=232-2*2*216+4(mod232)=-(218-4)=-262140。x的機(jī)器數(shù)為0000FFFEH,x*x的機(jī)器數(shù)為FFFC0004H。(2)(x-1<0)||x>0非永真。當(dāng)x=-2147483648時(shí),顯然,x<0,機(jī)器數(shù)為80000000H,x-1的機(jī)器數(shù)為7FFFFFFFH,符號位為0,因而x-1>0。此時(shí),(x-1<0)和x>0兩者都不成立。(3)x<0||-x<=0永真。若x>0,x符號位為0且數(shù)值部分為非0(至少有一位是1),從而使-x的符號位一定是1,即則-x<0;若x=0,則-x=0。綜上,只要x<0為假,則-x<=0一定為真,因而是永真。(4)x>0||-x>=0非永真。當(dāng)x=-2147483648時(shí),x<0,且x和-x的機(jī)器數(shù)都為80000000H,即-x<0。此時(shí),x>0和-x>=0兩者都不成立。(5)x&0xf!=15||(x<<28)<0非永真。這里!=的優(yōu)先級比&(按位與)的優(yōu)先級高。因此,若x=0,則x&0xf!=15為0,(x<<28)<0也為0,所以結(jié)果為假。(6)x>y==(-x<-y)非永真。當(dāng)x=-2147483648、y任意(除-2147483648外),或者y=-2147483648、x任意(除-2147483648外)時(shí)不等。因?yàn)閕nt型負(fù)數(shù)-2147483648是最小負(fù)數(shù),該數(shù)取負(fù)后結(jié)果仍為-2147483648,而不是2147483648。(7)~x+~y==~(x+y)永假。[-x]補(bǔ)=~[x]補(bǔ)+1,[-y]補(bǔ)=~[y]補(bǔ)+1,故~[x]補(bǔ)+~[y]補(bǔ)=[-x]補(bǔ)+[-y]補(bǔ)-2。

[-(x+y)]補(bǔ)=~[x+y]補(bǔ)+1,故~[x+y]補(bǔ)=[-(x+y)]補(bǔ)-1=[-x]補(bǔ)+[-y]補(bǔ)-1。由此可見,左邊比右邊少1。(8)(int)(ux-uy)==-(y-x)永真。(int)ux-uy=[x-y]補(bǔ)=[x]補(bǔ)+[-y]補(bǔ)=[-y+x]補(bǔ)=[-(y-x)]補(bǔ)(9)((x>>2)<<2)<=x永真。因?yàn)橛乙瓶偸窍蜇?fù)無窮大方向取整。(10)x*4+y*8==(x<<2)+(y<<3)永真。因?yàn)閹Х栒麛?shù)x乘以2k完全等于x左移k位,無論結(jié)果是否溢出。(11)x/4+y/8==(x>>2)+(y>>3)非永真。當(dāng)x=-1或y=-1時(shí),x/4或y/8等于0,但是,因?yàn)?1的機(jī)器數(shù)為全1,所以,x>>2或y>>3還是等于-1。此外,當(dāng)x或y為負(fù)數(shù)且x不能被4整除或y不能被8整除,則x/4不等于x>>2,y/8不等于y>>3。(12)x*y==ux*uy永真。根據(jù)第2.7.5節(jié)內(nèi)容可知,x*y的低32位和ux*uy的低32位是完全一樣的位序列。(13)x+y==ux+uy永真。根據(jù)第2.7.4節(jié)內(nèi)容可知,帶符號整數(shù)和無符號整數(shù)都是在同一個(gè)整數(shù)加減運(yùn)算部件中進(jìn)行運(yùn)算的,x和ux具有相同的機(jī)器數(shù),y和uy具有相同的機(jī)器數(shù),因而x+y和ux+uy具有完全一樣的位序列。(14)x*~y+ux*uy==-x永真。-y=~y+1,即~y=-y-1。而ux*uy=x*y,因此,等式左邊為x*(-y-1)+x*y=-x。變量dx、dy和dz的聲明和初始化如下:35.doubledx=(double)x;doubledy=(double)y;doubledz=(double)z;若float和double分別采用IEEE754單精度和雙精度浮點(diǎn)數(shù)格式,sizeof(int)=4,則對于任意int型變量x、y和z,判斷以下關(guān)系表達(dá)式是否永真。若永真則給出證明;若不永真則給出結(jié)果為假時(shí)x和y的取值。(1)dx*dx>=0(2)(double)(float)x==dx(4)(dx+dy)+dz==dx+(dy+dz)(6)dx/dx==dy/dy(3)dx+dy==(double)(x+y)(5)dx*dy*dz==dz*dy*dx參考答案:(1)dx*dx>=0永真。double型數(shù)據(jù)用IEEE754標(biāo)準(zhǔn)表示,尾數(shù)用原碼小數(shù)表示,符號和數(shù)值部分分開運(yùn)算。不管結(jié)果是否溢出都不會影響乘積的符號。(2)(double)(float)x==dx非永真。當(dāng)int型數(shù)據(jù)x的有效位數(shù)比float型可表示的最大有效位數(shù)24更多時(shí),x強(qiáng)制轉(zhuǎn)換為float型數(shù)據(jù)時(shí)有效位數(shù)丟失,而將x轉(zhuǎn)換為double型數(shù)據(jù)時(shí)沒有有效位數(shù)丟失。也即等式左邊可能是近似值,而右邊是精確值。(3)dx+dy==(double)(x+y)非永真。因?yàn)閤+y可能會溢出,而dx+dy不會溢出。(4)(dx+dy)+dz==dx+(dy+dz)永真。因?yàn)閐x、dy和dz是由32位int型數(shù)據(jù)轉(zhuǎn)換得到的,而double類型可以精確表示int類型數(shù)據(jù),并且對階時(shí)尾數(shù)移位位數(shù)不會超過52位,因此尾數(shù)不會舍入,因而不會發(fā)生大數(shù)吃小數(shù)的情況。

但是,如果dx、dy和dz是任意double類型數(shù)據(jù),則非永真。(5)dx*dy*dz==dz*dy*dx非永真。相乘的結(jié)果可能產(chǎn)生舍入。(6)dx/dx==dy/dy非永真。dx和dy中只要有一個(gè)為0、另一個(gè)不為0就不相等。36.在IEEE754浮點(diǎn)數(shù)運(yùn)算中,當(dāng)結(jié)果的尾數(shù)出現(xiàn)什么形式時(shí)需要進(jìn)行左規(guī),什么形式時(shí)需要進(jìn)行右規(guī)?如何進(jìn)行左規(guī),如何進(jìn)行右規(guī)?參考答案:(1)對于結(jié)果為±1x.xx?x的情況,需要進(jìn)行右規(guī)。右規(guī)時(shí),尾數(shù)右移一位,階碼加1。右規(guī)操作可以表示為:MbMb×2-1,EbEb+1。右規(guī)時(shí)注意以下兩點(diǎn):①尾數(shù)右移時(shí),最高位“1”被移到小數(shù)點(diǎn)前一位作為隱藏位,最后一位移出時(shí),要考慮舍入。②階碼加1時(shí),直接在末位加1。(2)對于結(jié)果為±0.00?01x?x的情況,需要進(jìn)行左規(guī)。左規(guī)時(shí),數(shù)值位逐次左移,階碼逐次減1,直到將第一位“1”移到小數(shù)點(diǎn)左邊。假定k為結(jié)果中“±”和最左邊第一個(gè)1之間連續(xù)0的個(gè)數(shù),則左規(guī)操作可以表示為:MbMb×2k,EbEb–k。左規(guī)時(shí)注意以下兩點(diǎn):①尾數(shù)左移時(shí)數(shù)值部分最左邊k個(gè)0被移出,因此,相對來說,小數(shù)點(diǎn)右移了k位。因?yàn)檫M(jìn)行尾數(shù)相加時(shí),默認(rèn)小數(shù)點(diǎn)位置在第一個(gè)數(shù)值位(即:隱藏位)之后,所以小數(shù)點(diǎn)右移k位后被移到了第一位1后面,這個(gè)1就是隱藏位。②執(zhí)行EbEb–k時(shí),每次都在末位減1,一共減k次。37.在IEEE754浮點(diǎn)數(shù)運(yùn)算中,如何判斷浮點(diǎn)運(yùn)算的結(jié)果是否溢出?參考答案:浮點(diǎn)運(yùn)算結(jié)果是否溢出,并不以尾數(shù)的溢出情況來判斷,而主要看階碼是否溢出。尾數(shù)溢出時(shí),可通過右規(guī)操作進(jìn)行糾正。階碼上溢時(shí),說明結(jié)果的數(shù)值太大,無法表示;階碼下溢時(shí),說明結(jié)果數(shù)值太小,可以把結(jié)果近似為0。在進(jìn)行對階、規(guī)格化、舍入和浮點(diǎn)數(shù)的乘/除運(yùn)算等過程中,都需要對階碼進(jìn)行加、減運(yùn)算,因而可能會發(fā)生階碼上溢或階碼下溢的情況,因此,必須對階碼進(jìn)行溢出判斷。(有關(guān)對階碼進(jìn)行溢出判斷的方法可參見教材中相關(guān)章節(jié)。)38.分別給出不能精確用IEEE754單精度和雙精度格式表示的最小正整數(shù)。參考答案:一個(gè)整數(shù)如果有效位數(shù)大于浮點(diǎn)表示格式中可表示的有效位數(shù)時(shí)就不能用浮點(diǎn)格式精確表示。因此,當(dāng)一個(gè)整數(shù)的有效位數(shù)大于24,則不能用IEEE754單精度格式精確表示,有效位數(shù)大于24的最小正整數(shù)是10?01=224+1=16777217;當(dāng)一個(gè)整數(shù)的有效位數(shù)大于53,則不能IEEE754雙精度格式精確表示。有效位數(shù)大于53的最小正整數(shù)是10?01=253+1。39.采用IEEE754單精度浮點(diǎn)數(shù)格式計(jì)算下列表達(dá)式的值。(1)0.75+(–65.25)(2)0.75–(–65.25)參考答案:x=0.75=0.110...0B=(1.10...0)2×2-1,y=–65.25=–1000001.01000...0B=(–1.00000101...0)2×26用IEEE754標(biāo)準(zhǔn)單精度格式表示為:[x]浮=00111111010...0[y]浮=110000101000001010...0所以,Ex=01111110,Mx=0(1).1...0,Ey=10000101,My=1(1).000001010...0尾數(shù)Mx和My中小數(shù)點(diǎn)前面有兩位,第一位為數(shù)符,第二位加了括號,是隱藏位“1”。以下是計(jì)算機(jī)中進(jìn)行浮點(diǎn)數(shù)加減運(yùn)算的過程(假定保留2位附加位:保護(hù)位和舍入位)(1)0.75+(–65.25)①對階:[ΔE]補(bǔ)=Ex+[–Ey]補(bǔ)(mod2n)=01111110+01111011=11111001,即ΔE=–7。

根據(jù)對階規(guī)則可知需對x進(jìn)行對階,結(jié)果為:Ex=Ey=10000101,Mx=00.000000110...000Mx右移7位,符號不變,數(shù)值高位補(bǔ)0,隱藏位右移到小數(shù)點(diǎn)后面,最后移出的2位保留②尾數(shù)相加:Mb=Mx+My=00.000000110...000+11.000001010...000(注意小數(shù)點(diǎn)在隱藏位后)根據(jù)原碼加/減法運(yùn)算規(guī)則,得:00.000000110...000+11.000001010...000=11.000000100…000上式尾數(shù)中最左邊第一位是符號位,其余都是數(shù)值部分,尾數(shù)后面兩位是附加位(加粗)。③規(guī)格化:尾數(shù)數(shù)值部分最高位為1,因此不需要進(jìn)行規(guī)格化。④舍入:把結(jié)果的尾數(shù)Mb中最后兩位附加位舍入掉,從本例來看,不管采用什么舍入法,結(jié)果都一樣,都是把最后兩個(gè)0去掉,得:Mb=11.000000100…0⑤溢出判斷:在上述階碼計(jì)算和調(diào)整過程中,沒有發(fā)生“階碼上溢”和“階碼下溢”的問題。因此,階碼Eb=10000101。最后結(jié)果為Eb=10000101,Mb=1(1).00000010…0,即:–64.5。(2)0.75–(–65.25)①對階:[ΔE]補(bǔ)=Ex+[–Ey]補(bǔ)(mod2n)=01111110+01111011=11111001,ΔE=-7。根據(jù)對階規(guī)則可知需要對x進(jìn)行對階,結(jié)果為:Ex=Ey=10000110,Mx=00.000000110...000Mx右移一位,符號不變,數(shù)值高位補(bǔ)0,隱藏位右移到小數(shù)點(diǎn)后面,最后移出的位保留②尾數(shù)相加:Mb=Mx–My=00.000000110...000–11.000001010...000(注意小數(shù)點(diǎn)在隱藏位后)根據(jù)原碼加/減法運(yùn)算規(guī)則,得:00.000000110...000–11.000001010...000=01.00001000…000上式尾數(shù)中最左邊第一位是符號位,其余都是數(shù)值部分,尾數(shù)后面兩位是附加位(加粗)。③規(guī)格化:尾數(shù)數(shù)值部分最高位為1,不需要進(jìn)行規(guī)格化。④舍入:把結(jié)果的尾數(shù)Mb中最后兩位附加位舍入掉,從本例來看,不管采用什么舍入法,結(jié)果都一樣,都是把最后兩個(gè)0去掉,得:Mb=01.00001000…0⑤溢出判斷:在上述階碼計(jì)算和調(diào)整過程中,沒有發(fā)生“階碼上溢”和“階碼下溢”的問題。因此,階碼Eb=10000101。最后結(jié)果為Eb=10000101,Mb=0(1).00001000…0,即:+66。40.以下是函數(shù)fpower2的C語言源程序,它用于計(jì)算2x的浮點(diǎn)數(shù)表示,其中調(diào)用了函數(shù)u2f,u2f用于將一個(gè)無符號整數(shù)表示的0/1序列作為float類型返回。請?zhí)顚慺power2函數(shù)中的空白部分,以使其能正確計(jì)算結(jié)果。1{floatfpower2(intx)23unsignedexp,frac,u;45if(x<exp=){/*值太小,返回0.0*/6;;7frac=}elseif(x<exp=8){/*返回非規(guī)格化結(jié)果*/9;;1011121314151617frac=}elseif(x<exp=){/*返回規(guī)格化結(jié)果*/;;frac=}else{exp=/*值太大,返回+∞*/;;frac=}

181920u=exp<<23|frac;returnu2f(u);}參考答案:12345floatfpower2(intx){unsignedexp,frac,u;if(x<-149){/*值太小,返回0.0*/6exp=frac=00;7;8}elseif(x<exp=-1260){/*返回非規(guī)格化結(jié)果*/9;1011121314151617181920frac=0x400000>>(-x-127);}elseif(x<exp=128){;/*返回規(guī)格化結(jié)果*/x+127frac=0;}else{exp=/*值太大,返回+∞*/2550;frac=;}u=exp<<23|frac;returnu2f(u);}41.以下是一組關(guān)于浮點(diǎn)數(shù)按位級進(jìn)行運(yùn)算的編程題目,其中用到一個(gè)數(shù)據(jù)類型float_bits,它被定義為unsignedint類型。以下程序代碼必須采用IEEE754標(biāo)準(zhǔn)規(guī)定的運(yùn)算規(guī)則,例如,舍入應(yīng)采用就近舍入到偶數(shù)的方式。此外,代碼中不能使用任何浮點(diǎn)數(shù)類型、浮點(diǎn)數(shù)運(yùn)算和浮點(diǎn)常數(shù),只能使用float_bits類型;不能使用任何復(fù)合數(shù)據(jù)類型,如數(shù)組、結(jié)構(gòu)和聯(lián)合等;可以使用無符號整數(shù)或帶符號整數(shù)的數(shù)據(jù)類型、常數(shù)和運(yùn)算。要求編程實(shí)現(xiàn)以下功能并進(jìn)行正確性測試,需要針對參數(shù)f的所有32位組合情況進(jìn)行處理。(1)計(jì)算浮點(diǎn)數(shù)f的絕對值|f|。若f為NaN,則返回f,否則返回|f|。函數(shù)原型為:float_bitsfloat_abs(float_bitsf);(2)計(jì)算浮點(diǎn)數(shù)f的負(fù)數(shù)-f。若f為NaN,則返回f,否則返回-f。函數(shù)原型為:float_bitsfloat_neg(float_bitsf);(3)計(jì)算0.5*f。若f為NaN,則返回f,否則返回0.5*f。函數(shù)原型為:float_bitsfloat_half(float_bitsf);(4)計(jì)算2.0*f。若f為NaN,則返回f,否則返回2.0*f。函數(shù)原型為:float_bitsfloat_twice(float_bitsf);(5)將int型整數(shù)i的位序列轉(zhuǎn)換為float型位序列。函數(shù)原型為:float_bitsfloat_i2f(inti);(6)將浮點(diǎn)數(shù)f的位序列轉(zhuǎn)換為int型位序列。若f為非規(guī)格化數(shù),則返回值為0;若f是NaN或±∞或超出int型數(shù)可表示范圍,則返回值為0x80000000;若f帶小數(shù)部分,則考慮舍入。函數(shù)原型為:intfloat_f2i(float_bitsf);

參考答案:(1)計(jì)算浮點(diǎn)數(shù)f的絕對值|f|。若f為NaN,則返回f,否則返回|f|。float_bitsfloat_abs(float_bitsf){unsignedsign=f>>31;unsignedexp=f>>23

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論