您好,欢迎访问三七文档
第二章习题答案1.给出以下概念的解释说明。真值机器数数值数据非数值数据无符号整数带符号整数定点数原码补码变形补码溢出浮点数尾数阶阶码移码阶码下溢阶码上溢规格化数左规右规非规格化数机器零非数(NaN)BCD码逻辑数ASCII码汉字输入码汉字内码机器字长大端方式小端方式最高有效位最高有效字节(MSB)最低有效位最低有效字节(LSB)掩码算术移位逻辑移位0扩展符号扩展零标志ZF溢出标志OF符号标志SF进位/借位标志CF2.简单回答下列问题。(1)为什么计算机内部采用二进制表示信息?既然计算机内部所有信息都用二进制表示,为什么还要用到十六进制或八进制数?(2)常用的定点数编码方式有哪几种?通常它们各自用来表示什么?(3)为什么现代计算机中大多用补码表示带符号整数?(4)在浮点数的基数和总位数一定的情况下,浮点数的表示范围和精度分别由什么决定?两者如何相互制约?(5)为什么要对浮点数进行规格化?有哪两种规格化操作?(6)为什么有些计算机中除了用二进制外还用BCD码来表示数值数据?(7)为什么计算机处理汉字时会涉及到不同的编码(如,输入码、内码、字模码)?说明这些编码中哪些用二进制编码,哪些不用二进制编码,为什么?3.实现下列各数的转换。(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=(?)24.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的原码表示。+0.1001,–0.1001,+1.0,–1.0,+0.010100,–0.010100,+0,–05.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的补码和移码表示。+1001,–1001,+1,–1,+10100,–10100,+0,–06.已知[x]补,求x(1)[x]补=11100111(2)[x]补=10000000(3)[x]补=01010010(4)[x]补=110100117.某32位字长的机器中带符号整数用补码表示,浮点数用IEEE754标准表示,寄存器R1和R2的内容分别为R1:0000108BH,R2:8080108BH。不同指令对寄存器进行不同的操作,因而不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少?(1)无符号整数加法指令(2)带符号整数乘法指令(3)单精度浮点数减法指令8.假定机器M的字长为32位,用补码表示带符号整数。表2.12中第一列给出了在机器M上执行的C语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。表2.12题8用表关系表达式运算类型结果说明0==0U–10–10U2147483647–2147483647–12147483647U–2147483647–12147483647(int)2147483648U–1–2(unsigned)–1–2无符号整数有符号整数0111…1B(232–1)00…0B(0)011…1B(231–1)100…0B(–231)9.在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器数(用十六进制表示)。(1)intx=-32768(2)shorty=522(3)unsignedz=65530(4)charc=’@’(5)floata=-1.1(6)doubleb=10.510.在32位计算机中运行一个C语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机器数(用十六进制表示)如下,请写出它们对应的真值。(1)intx:FFFF0006H(2)shorty:DFFCH(3)unsignedz:FFFFFFFAH(4)charc:2AH5)floata:C4480000H(6)doubleb:C024800000000000H11.以下给出的是一些字符串变量在内存中存放的字符串机器码,请根据ASCII码定义写出对应的字符串。指出代码0AH和00H对应的字符的含义。(1)char*mystring1:68H65H6CH6CH6FH2CH77H6FH72H6CH64H0AH00H(2)char*mystring2:77H65H20H61H72H65H20H68H61H70H70H79H21H00H12.以下给出的是一些字符串变量的初值,请写出对应的机器码。(1)char*mystring1=./myfile(2)char*mystring2=OK,good!13.已知C语言中的按位异或运算(“XOR”)用符号“^”表示。对于任意一个位序列a,a^a=0,C语言程序可以利用这个特性来实现两个数值交换的功能。以下是一个实现该功能的C语言函数:1voidxor_swap(int*x,int*y)2{3*y=*x^*y;/*第一步*/4*x=*x^*y;/*第二步*/5*y=*x^*y;/*第三步*/6}假定执行该函数时*x和*y的初始值分别为a和b,即*x=a且*y=b,请给出每一步执行结束后,x和y各自指向的内存单元中的内容分别是什么?14.假定某个实现数组元素倒置的函数reverse_array调用了第13题中给出的xor_swap函数:1voidreverse_array(inta[],intlen)2{3intleft,right=len-1;4for(left=0;left=right;left++,right--)5xor_swap(&a[left],&a[right]);6}当len为偶数时,reverse_array函数的执行没有问题。但是,当len为奇数时,函数的执行结果不正确。请问,当len为奇数时会出现什么问题?最后一次循环中的left和right各取什么值?最后一次循环中调用xor_swap函数后的返回值是什么?对reverse_array函数作怎样的改动就可消除该问题?15.假设以下表2.13中的x和y是某C语言程序中的char型变量,请根据C语言中的按位运算和逻辑运算的定义,填写表2.13,要求用十六进制形式填写。表2.13题15用表xyx^yx&yx|y~x|~yx&!yx&&yx||y!x||!yx&&~y0x5F0xA00xC70xF00x800x7F0x070x5516.对于一个n(n≥8)位的变量x,请根据C语言中按位运算的定义,写出满足下列要求的C语言表达式。(1)x的最高有效字节不变,其余各位全变为0。(2)x的最低有效字节不变,其余各位全变为0。(3)x的最低有效字节全变为0,其余各位取反。(4)x的最低有效字节全变1,其余各位不变。17.以下是一个由反汇编器生成的一段针对某个小端方式处理器的机器级代码表示文本,其中,最左边是指令所在的存储单元地址,冒号后面是指令的机器码,最右边是指令的汇编语言表示,即汇编指令。已知反汇编输出中的机器数都采用补码表示,请给出指令代码中划线部分表示的机器数对应的真值。80483d2:81ecb8010000sub&0x1b8,%esp80483d8:8b5508mov0x8(%ebp),%edx80483db:83c214add$0x14,%edx80483de:8b8558feffffmov0xfffffe58(%ebp),%eax80483e4:0302add(%edx),%eax80483e6:898574feffffmov%eax,0xfffffe74(%ebp)80483ec:8b5508mov0x8(%ebp),%edx80483ef:83c244add$0x44,%edx80483f2:8b85c8feffffmov0xfffffec8(%ebp),%eax80483f8:8902mov%eax,(%edx)80483fa:8b4510mov0x10(%ebp),%eax80483fd:03450cadd0xc(%ebp),%eax8048400:8985ecfeffffmov%eax,0xfffffeec(%ebp)8048406:8b4508mov0x8(%ebp),%eax8048409:83c020add$0x20,%eax18.假设以下C语言函数compare_str_len用来判断两个字符串的长度,当字符串str1的长度大于str2的长度时函数返回值为1,否则为0。1intcompare_str_len(char*str1,char*str2)2{3returnstrlen(str1)-strlen(str2)0;4}已知C语言标准库函数strlen原型声明为“size_tstrlen(constchar*s);”,其中,size_t被定义为unsignedint类型。请问:函数compare_str_len在什么情况下返回的结果不正确?为什么?为使函数正确返回结果应如何修改代码?19.考虑以下C语言程序代码:1intfunc1(unsignedword)2{3return(int)((word24)24);4}5intfunc2(unsignedword)6{7return((int)word24)24;8}假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写表2.14,并说明函数func1和func2的功能。表2.14题19用表wfunc1(w)func2(w)机器数值机器数值机器数值12712825525620.填写表2.15,注意对比无符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。表2.15题20用表模式xyx×y(截断前)x×y(截断后)机器数值机器数值机器数值机器数值无符号110010带符号110010无符号001111带符号001111无符号111111带符号11111121.以下是两段C语言代码,函数arith()是直接用C语言写的,而optarith()是对arith()函数以某个确定的M和N编译生成的机器代码反编译生成的。根据optarith(),可以推断函数arith()中M和N的值各是多少?#defineM#defineNintarith(intx,inty){intresult=0;result=x*M+y/N;returnresult;}intoptarith(intx,inty){intt=x;x=4;x–=t;if(y0)y+=3;y2;returnx+y;}22.下列几种情况所能表示的数的范围是什么?(1)16位无符号整数(2)16位补码表示的带符号整数(3)下述格式的浮点数(基数为2,移码的偏置常数为128)23.以IEEE754单精度浮点数格式表示下列十进制数。+1.75,+19,–1/8,25824.设一个变量的值为4098,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果用十六进制形式表示),并说明哪段二进制位序列在两种表示中完全相同,为什么会相同?25.设一个变量的值为–2147483647(提示:2147483647=231-1),要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果用十六进制形式表示),并说明哪种表示其值完全精确,哪种表示的是近似值。26.下表给出了有关IEEE754浮点格式表示中一些重要的非负数的取值,表中已经有最大规格化数的相应内容,要求填入其他浮点数格式的相应内容。表2.16题26用表项目阶码尾数单精度双精度以2的幂次表示的值以10的幂次表示的值以2的幂次表示的值以10的幂次表示的值01最大规格化数最小规格化数最大非规格化数最小非规格化数+∞NaN111111101…11(2–2-23)×21273.4×1038(2–2-52)×210231.8×1030827.已知下列字符编码:A为100
本文标题:第二章习题-ddg
链接地址:https://www.777doc.com/doc-2125881 .html