习题-ddg
第⼆章习题答案
1.给出以下概念的解释说明。
真值机器数数值数据⾮数值数据⽆符号整数带符号整数
定点数原码补码变形补码溢出浮点数
尾数阶阶码移码阶码下溢阶码上溢
规格化数左规右规⾮规格化数机器零⾮数(NaN)
BCD码逻辑数ASCII码汉字输⼊码汉字内码机器字长
⼤端⽅式⼩端⽅式最⾼有效位最⾼有效字节(MSB) 最低有效位
最低有效字节(LSB) 掩码算术移位逻辑移位0扩展
符号扩展零标志ZF 溢出标志OF 符号标志SF 进位/借位标志CF
2.简单回答下列问题。
(1)为什么计算机内部采⽤⼆进制表⽰信息既然计算机内部所有信息都⽤⼆进制表⽰,为什么还要⽤到⼗六进制或⼋进制数
(2)常⽤的定点数编码⽅式有哪⼏种通常它们各⾃⽤来表⽰什么
(3)为什么现代计算机中⼤多⽤补码表⽰带符号整数
(4)在浮点数的基数和总位数⼀定的情况下,浮点数的表⽰范围和精度分别由什么决定两者如何相互制约
(5)为什么要对浮点数进⾏规格化有哪两种规格化操作
(6)为什么有些计算机中除了⽤⼆进制外还⽤BCD码来表⽰数值数据
(7)为什么计算机处理汉字时会涉及到不同的编码(如,输⼊码、内码、字模码)说明这些编码中哪些⽤⼆进制编码,哪些不⽤⼆进制编码,为什么
3.实现下列各数的转换。
(1)10= ()2= () 8= () 16
(2)2 = ()10= () 8= () 16= () 8421
(3)(0101 1001 8421 = ()10= () 2= () 16
(4)16 = ()10= () 2
4.假定机器数为8位(1位符号,7位数值),写出下列各⼆进制数的原码表⽰。
+,–,+,–,+,–,+0,–0
5.假定机器数为8位(1位符号,7位数值),写出下列各⼆进制数的补码和移码表⽰。
+1001,–1001,+1,–1,+10100,–10100,+0,–0
6.已知[x]补,求x
(1)[x]补= (2)[x]补= (3)[x]补=01010010 (4)[x]补=
7.某32位字长的机器中带符号整数⽤补码表⽰,浮点数⽤IEEE 754标准表⽰,寄存器R1和R2的内容
分别为R1:0000108BH,R2:8080108BH。不同指令对寄存器进⾏不同的操作,因⽽不同指令执⾏时寄存器内容对应的真值不同。假定执⾏下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少
(1)⽆符号整数加法指令
(2)带符号整数乘法指令
(3)单精度浮点数减法指令
8.假定机器M的字长为32位,⽤补码表⽰带符号整数。表中第⼀列给出了在机器M上执⾏的C语⾔程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
表题8⽤表
9.在32位计算机中运⾏⼀个C语⾔程序,在该程序中出现了以下变量的初值,请写出它们对应的机器数(⽤⼗六进制表⽰)。
(1)int x=-32768 (2)short y=522 (3)unsigned z=65530
(4)char c=’@’(5)float a= (6)double b=
10. 在32位计算机中运⾏⼀个C语⾔程序,在该程序中出现了⼀些变量,已知这些变量在某⼀时刻的机
器数(⽤⼗六进制表⽰)如下,请写出它们对应的真值。
(1)int x:FFFF0006H (2)short y:DFFCH (3)unsigned z:FFFFFFFAH
(4)char c:2AH 5)float a:C4480000H (6)double b:C0000000H
11. 以下给出的是⼀些字符串变量在内存中存放的字符串机器码,请根据ASCII码定义写出对应的字符串。
指出代码0AH和00H对应的字符的含义。
(1)char *mystring1:68H 65H 6CH 6CH 6FH 2CH 77H 6FH 72H 6CH 64H 0AH 00H
(2)char *mystring2:77H 65H 20H 61H 72H 65H 20H 68H 61H 70H 70H 79H 21H 00H
12. 以下给出的是⼀些字符串变量的初值,请写出对应的机器码。
汇编指令有多少个(1)char *mystring1="./myfile" (2)char *mystring2="OK, good!"
13. 已知C语⾔中的按位异或运算(“XOR”)⽤符号“^”表⽰。对于任意⼀个位序列a,a^a=0,C语⾔程序
可以利⽤这个特性来实现两个数值交换的功能。以下是⼀个实现该功能的C语⾔函数:
1 void xor_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函数:
1 void reverse_array(int a[], int len)
2 {
3 int left, right=len-1;
4 for (left=0; left<=right; left++, right--)
5 xor_swap(&a[left], &a[right]);
6 }
当len为偶数时,reverse_array函数的执⾏没有问题。但是,当len为奇数时,函数的执⾏结果不正确。请问,当len为奇数时会出现什么问题最后⼀次循环中的left和right各取什么值最后⼀次循环中调⽤xor_swap函数后的返回值是什么对reverse_array 函数作怎样的改动就可消除该问题
15. 假设以下表中的x和y是某C语⾔程序中的char型变量,请根据C语⾔中的按位运算和逻辑运算的
定义,填写表,要求⽤⼗六进制形式填写。
16.对于⼀个n(n≥8)位的变量x,请根据C语⾔中按位运算的定义,写出满⾜下列要求的C语⾔表达式。
(1)x的最⾼有效字节不变,其余各位全变为0。
(2)x的最低有效字节不变,其余各位全变为0。
(3)x的最低有效字节全变为0,其余各位取反。
(4)x的最低有效字节全变1,其余各位不变。
17. 以下是⼀个由反汇编器⽣成的⼀段针对某个⼩端⽅式处理器的机器级代码表⽰⽂本,其中,最左边
是指令所在的存储单元地址,冒号后⾯是指令的机器码,最右边是指令的汇编语⾔表⽰,即汇编指令。已知反汇编输出中的机器数都采⽤补码表⽰,请给出指令代码中划线部分表⽰的机器数对应的真值。
80483d2: 81 ec b8 01 00 00 sub &0x1b8, %esp
80483d8: 8b 55 08 mov 0x8(%ebp), %edx
80483db: 83 c2 14 add $0x14, %edx
80483de: 8b 85 58 fe ff ff mov 0xfffffe58(%ebp), %eax
80483e4: 03 02 add (%edx), %eax
80483e6: 89 85 74 fe ff ff mov %eax, 0xfffffe74(%ebp)
80483ec: 8b 55 08 mov 0x8(%ebp), %edx
80483ef: 83 c2 44 add $0x44, %edx
80483f2: 8b 85 c8 fe ff ff mov 0xfffffec8(%ebp), %eax
80483f8: 89 02 mov %eax, (%edx)
80483fa: 8b 45 10 mov 0x10(%ebp), %eax
80483fd: 03 45 0c add 0xc(%ebp), %eax
8048400: 89 85 ec fe ff ff mov %eax, 0xfffffeec(%ebp)
8048406: 8b 45 08 mov 0x8(%ebp), %eax
8048409: 83 c0 20 add $0x20, %eax
18. 假设以下C语⾔函数compare_str_len⽤来判断两个字符串的长度,当字符串str1的长度⼤于str2
的长度时函数返回值为1,否则为0。
1 int compare_str_len(char *str1, char *str2)
2 {
3 return strlen(str1) - strlen(str2) > 0;
4 }
已知C语⾔标准库函数strlen原型声明为“size_t strlen(const char *s);”,其中,size_t被定义为unsigned int类型。请问:函数compare_str_len在什么情况下返回的结果不正确为什么为使函数正确返回结果应如何修改代码
19.考虑以下C语⾔程序代码:
1 int func1(unsigned word)
2 {
3 return (int) (( word <<24) >> 24);
4 }
5 int func2(unsigned word)
6 {
7 return ( (int) word <<24 ) >> 24;
8 }
假设在⼀个32位机器上执⾏这些函数,该机器使⽤⼆进制补码表⽰带符号整数。⽆符号数采⽤逻辑移位,带符号整数采⽤算术移位。请填写表,并说明函数func1和func2的功能。
表题19⽤表
20.填写表,注意对⽐⽆符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。
表题20⽤表
21.以下是两段C语⾔代码,函数arith( )是直接⽤C语⾔写的,⽽optarith( )是对arith( )函数以某个确定的M和N编译⽣成的机器代码反编译⽣成的。根据optarith( ),可以推断函数arith( ) 中M和N的值各是多少
#define M
#define N
int arith (int x, int y)
{
int result = 0 ;
result = x*M + y/N;
return result;
}
int optarith ( int x, int y)
{
int t = x;
x << = 4;
x – = t;
if ( y < 0 ) y += 3;
y>>2;
return x+y;
}
22. 下列⼏种情况所能表⽰的数的范围是什么
(1)16位⽆符号整数
(2)16位补码表⽰的带符号整数
(3)下述格式的浮点数(基数为2,移码的偏置常数为128)
1位8位移码7位原码数值部分
23. 以IEEE 754单精度浮点数格式表⽰下列⼗进制数。
+,+19,–1/8,258
24.设⼀个变量的值为4098,要求分别⽤32位补码整数和IEEE 754单精度浮点格式表⽰该变量(结果⽤⼗六进制形式表⽰),并说明哪段⼆进制位序列在两种表⽰中完全相同,为什么会相同
25.设⼀个变量的值为–2 147 483 647(提⽰:2 147 483 647=231-1),要求分别⽤32位补码整数和IEEE754单精度浮点格式表⽰该变量(结果⽤⼗六进制形式表⽰),并说明哪种表⽰其值完全精确,哪种表⽰的是近似值。
26.下表给出了有关IEEE 754浮点格式表⽰中⼀些重要的⾮负数的取值,表中已经有最⼤规格化数的相应内容,要求填⼊其他浮点数格式的相应内容。
表题26⽤表
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论