第二章习题ddg.docx
《第二章习题ddg.docx》由会员分享,可在线阅读,更多相关《第二章习题ddg.docx(6页珍藏版)》请在冰豆网上搜索。
第二章习题ddg
第二章习题-ddg
第二章习题答案
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)(__.011)2=(?
)10=(?
)8=(?
)16=(?
)8421
(3)(010110010110.0011)8421=(?
)10=(?
)2=(?
)16(4)(4E.C)16=(?
)10=(?
)2
4.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的原码表示。
+0.1001,–0.1001,+1.0,–1.0,+0.0__,–0.0__,+0,–05.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的补码和移码表示。
+1001,–1001,+1,–1,+__,–__,+0,–06.已知[x]补,求x
(1)[x]补=__-__
(2)[x]补=__-__(3)[x]补=__-__(4)[x]补=__-__
7.某32位字长的机器中带符号整数用补码表示,浮点数用IEEE754标准表示,寄存器R1和R2的内
容分别为R1:
__-__BH,R2:
__-__BH。
不同指令对寄存器进行不同的操作,因而不同指令执行时寄存器内容对应的真值不同。
假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少?
(1)无符号整数加法指令
(2)带符号整数乘法指令(3)单精度浮点数减法指令
8.假定机器M的字长为32位,用补码表示带符号整数。
表2.12中第一列给出了在机器M上执行的C
语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
表2.12题8用表
关系表达式运算类型结果说明0==0U–10–10U__-__47–__-__47–1__-__47U–__-__47–1__-__47(int)__-__48U–1–2(unsigned)–1–2无符号整数有符号整数0111。
1B(232–1)00。
0B(0)011。
1B(231–1)100。
0B(–231)9.在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器
数(用十六进制表示)。
(1)intx=-__
(2)shorty=522(3)unsignedz=__(4)charc=’@’(5)floata=-1.1(6)doubleb=10.5
10.在32位计算机中运行一个C语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机
器数(用十六进制表示)如下,请写出它们对应的真值。
(1)intx:
__6H
(2)shorty:
DFFCH(3)unsignedz:
__AH(4)charc:
2AH5)floata:
C__-__H(6)doubleb:
C__-__-__H
11.以下给出的是一些字符串变量在内存中存放的字符串机器码,请根据ASCII码定义写出对应的字符
串。
指出代码0AH和00H对应的字符的含义。
(1)char*mystring1:
68H65H6CH6CH6FH2CH77H6FH72H6CH64H0AH00H
(2)char*mystring2:
77H65H20H61H72H65H20H68H61H70H70H79H21H00H12.以下给出的是一些字符串变量的初值,请写出对应的机器码。
(1)char*mystring1=\
(2)char*mystring2=\
13.已知C语言中的按位异或运算(“XOR”)用符号“^”表示。
对于任意一个位序列a,a^a=0,C语言程
序可以利用这个特性来实现两个数值交换的功能。
以下是一个实现该功能的C语言函数:
1voidxor_swap(int__,int*y)2{3*y=__^*y;/*第一步*/
4__=__^*y;/*第二步*/5*y=__^*y;/*第三步*/6}
假定执行该函数时__和*y的初始值分别为a和b,即__=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用表
x0x5F0xC70x800x07y0xA00xF00x7F0x55x^yxyx|y~x|~yx!
yxyx||y!
x||!
yx~y16.对于一个n(n≥8)位的变量x,请根据C语言中按位运算的定义,写出满足下列要求的C语言表达
式。
(1)x的最高有效字节不变,其余各位全变为0。
(2)x的最低有效字节不变,其余各位全变为0。
(3)x的最低有效字节全变为0,其余各位取反。
(4)x的最低有效字节全变1,其余各位不变。
17.以下是一个由反汇编器生成的一段针对某个小端方式处理器的机器级代码表示文本,其中,最左边
是指令所在的存储单元地址,冒号后面是指令的机器码,最右边是指令的汇编语言表示,即汇编指令。
已知反汇编输出中的机器数都采用补码表示,请给出指令代码中划线部分表示的机器数对应的真值。
__d2:
81ecb8010000sub0x1b8,%esp__d8:
8b5508mov0x8(?
p),íx__db:
83c214add$0x14,íx
__de:
8b8558feffffmov0xfffffe58(?
p),êx__e4:
0302add(íx),êx
__e6:
898574feffffmovêx,0xfffffe74(?
p)__ec:
8b5508mov0x8(?
p),íx__ef:
83c244add$0x44,íx
__f2:
8b85c8feffffmov0xfffffec8(?
p),êx__f8:
8902movêx,(íx)__fa:
8b4510mov0x10(?
p),êx__fd:
03450cadd0xc(?
p),êx
__-__:
8985ecfeffffmovêx,0xfffffeec(?
p)__-__:
8b4508mov0x8(?
p),êx__-__:
83c020add$0x20,êx
18.假设以下C语言函数compare_str_len用来判断两个字符串的长度,当字符串str1的长度大于str2的
长度时函数返回值为1,否则为0。
1intcompare_str_len(char*str1,char*str2)2{3returnstrlen(str1)-strlen(str2)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用表
w机器数值127128255256机器数func1(w)值机器数func2(w)值20.填写表2.15,注意对比无符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。
表2.15题20用表
模式无符号带符号无符号带符号无符号带符号x机器数110110001001111111值机器数010010111111111111y值__y(截断前)机器数值__y(截断后)机器数值
21.以下是两段C语言代码,函数arith()是直接用C语言写的,而optarith()是对arith()函数以某个确定
的M和N编译生成的机器代码反编译生成的。
根据optarith(),可以推断函数arith()中M和N的值各是多少?
#defineM#defineN
intarith(intx,inty){
intresult=0;
result=__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)
数符尾数阶码
8位移码7位原码数值部分
23.以IEEE754单精度浮点数格式表示下列十进制数。
+1.75,+19,–1/8,258
24.设一个变量的值为4098,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果
用十六进制形式表示),并说明哪段二进制位序列在两种表示中完全相同,为什么会相同?
25.设一个变量的值为–2147483647(提示:
2147483647=231-1),要求分别用32位补码整数和__
单精度浮点格式表示该变量(结果用十六进制形式表示),并说明哪种表示其值完全精确,哪种表示的是近似值。
26.下表给出了有关IEEE754浮点格式表示中一些重要的非负数的取值,表中已经有最大规格化数的相
应内容,要求填入其他浮点数格式的相应内容。
表2.16题26用表
单精度项目01最大规格化数最小规格化数最大非规格化数最小非规格化数+∞NaN阶码__-__尾数1。
11以2的幂次表示的值(2–2-23)×2127以10的幂次表示的值3.4×1038双精度以2的幂次表示的值(2–2-52)__以10的幂次表示的值1.8__1位
27.已知下列字符编码:
A为1000001,a为1100001,0为0110000,求E、e、f、7、G、Z、5的7位
ACSII码和在第一位前加入奇校验位后的8位编码。
28.假定在一个程序中定义了变量x、y和i,其中,x和y是float型变量(用__单精度浮点数表
示),i是16位short型变量(用补码表示)。
程序执行到某一时刻,x=–0.125、y=7.5、i=100,它们都被写到了主存(按字节编址),其地址分别是100,108和112。
请分别画出在大端机器和小端机器上变量x、y和i中每个字节在主存的存放位置。
29.对于图2.6,假设n=8,机器数X和Y的真值分别是x和y。
请按照图2.6的功能填写表2.17,并给
出对每个结果的解释。
要求机器数用十六进制形式填写,真值用十进制形式填写。
表2.17题29用表
表示无符号带符号无符号带符号X0xB00xB00x7E0x7ExY0x8C0x8C0x5D0x5DyX+Yx+yOFSFCFX-Yx-yOFSFCF30.在字长为32位的计算机上,有一个函数其原型声明为“intch_mul_overflow(intx,inty);”,该函数用
于对两个int型变量x和y的乘积判断是否溢出,若溢出则返回1,否则返回0。
请使用64位精度的整数类型longlong来编写该函数。
31.对于第2.7.5节中例2.31存在的整数溢出漏洞,如果将其中的第5行改为以下两个语句: