您的当前位置:首页正文

第二章习题-ddg

2022-10-07 来源:爱go旅游网
第 二 章 习 题 答 案

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用表

关系表达式 运算类型 结果 说明 0 == 0U –1 < 0 –1 < 0U 47 > –47 – 1 47U > –47 – 1 47 > (int) 48U –1 > –2 (unsigned) –1 > –2 无符号整数 有符号整数 0 1 11…1B (2–1) > 00…0B(0) 011…1B (2–1) > 100…0B (–2) 313132

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语言中的按位运算和逻辑运算的

定义,填写表,要求用十六进制形式填写。

表 题15用表

x 0x5F 0xC7 0x80 0x07 y 0xA0 0xF0 0x7F 0x55 x^y x&y x|y ~x|~y x&!y x&&y x || y !x || !y x&&~y 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用表

w 机器数 值 127 128 255 256 机器数 func1(w) 值 机器数 func2(w) 值 20.填写表,注意对比无符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。

表 题20用表

模式 无符号 带符号 无符号 带符号 无符号 带符号 x 机器数 110 110 001 001 111 111 值 机器数 010 010 111 111 111 111 y 值 x×y(截断前) 机器数 值 x×y(截断后) 机器数 值

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单精度浮点格式表示该变量(结果

用十六进制形式表示),并说明哪段二进制位序列在两种表示中完全相同,为什么会相同

31

25.设一个变量的值为–2 147 483 647(提示:2 147 483 647=2-1),要求分别用32位补码整数和IEEE754

单精度浮点格式表示该变量(结果用十六进制形式表示),并说明哪种表示其值完全精确,哪种表示的是近似值。

26.下表给出了有关IEEE 754浮点格式表示中一些重要的非负数的取值,表中已经有最大规格化数的相

应内容,要求填入其他浮点数格式的相应内容。

表 题26用表

单精度 项目 0 1 最大规格化数 最小规格化数 最大非规格化数 最小非规格化数 +∞ NaN 阶码 尾数 1…11 以2的幂次表示的值 (2–2)×2 -23127双精度 以2的幂次 表示的值 (2–2)×2 -521023以10的幂次表示的值 以10的幂次 表示的值 ×1038 ×10308 27.已知下列字符编码:A为100 0001,a为110 0001,0为011 0000,求E、e、f、7、G、Z、5的7

位ACSII码和在第一位前加入奇校验位后的8位编码。

28.假定在一个程序中定义了变量x、y和i,其中,x和y是float型变量(用IEEE754单精度浮点数

表示),i是16位short型变量(用补码表示)。程序执行到某一时刻,x= –、y=、i=100,它们都被写到了主存(按字节编址),其地址分别是100,108和112。请分别画出在大端机器和小端机器上变量x、y和i中每个字节在主存的存放位置。

29. 对于图,假设n=8,机器数X和Y的真值分别是x和y。请按照图的功能填写表,并给出对每个结

果的解释。要求机器数用十六进制形式填写,真值用十进制形式填写。

表 题29用表

表示 无符号 带符号 无符号 带符号 X 0xB0 0xB0 0x7E 0x7E x Y 0x8C 0x8C 0x5D 0x5D y X+Y x+y OF SF CF X-Y x-y OF SF CF 30. 在字长为32位的计算机上,有一个函数其原型声明为“int ch_mul_overflow(int x, int y);”,

该函数用于对两个int型变量x和y的乘积判断是否溢出,若溢出则返回1,否则返回0。请使用64位精度的整数类型long long来编写该函数。

31.对于第节中例存在的整数溢出漏洞,如果将其中的第5行改为以下两个语句:

unsigned long long arraysize=count*(unsigned long long)sizeof(int); int *myarray = (int *) malloc(arraysize);

已知C语言标准库函数malloc的原型声明为“void *malloc(size_t size);”,其中,size_t定义

为unsigned int类型,则上述改动能否消除整数溢出漏洞若能则说明理由;若不能则给出修改方案。 32. 已知一次整数加法、一次整数减法和一次移位操作都只需一个时钟周期,一次整数乘法操作需要10

个时钟周期。若x为一个整型变量,现要计算55*x,请给出一种计算表达式,使得所用时钟周期数最少。

33.假设x为一个int型变量,请给出一个用来计算x/32的值的函数div32。要求不能使用除法、乘法、

模运算、比较运算、循环语句和条件语句,可以使用右移、加法以及任何按位运算。 34. 无符号整数变量ux和uy的声明和初始化如下: unsigned ux=x; unsigned uy=y;

若sizeof(int)=4,则对于任意int型变量x和y,判断以下关系表达式是否永真。若永真则给出证

明;若不永真则给出结果为假时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 (6)x>y==(-x<-y)

(7)~x+~y==~(x+y) (8)(int) (ux-uy) == -(y-x) (9)((x>>2)<<2) <= x (10)x*4+y*8==(x<<2)+(y<<3) (11)x/4+y/8==(x>>2)+(y>>3) (12)x*y==ux*uy (13)x+y==ux+uy (14)x*~y+ux*uy==-x 35. 变量dx、dy和dz的声明和初始化如下: double dx = (double) x; double dy = (double) y; double dz = (double) z;

若float和double分别采用IEEE 754单精度和双精度浮点数格式,sizeof(int)=4,则对于任意int

型变量x、y和z,判断以下关系表达式是否永真。若永真则给出证明;若不永真则给出结果为假时x和y的取值。

(1)dx*dx >= 0 (2)(double)(float) x == dx (3)dx+dy == (double) (x+y) (4)(dx+dy)+dz == dx+(dy+dz)

(5)dx*dy*dz == dz*dy*dx (6)dx/dx == dy/dy

36. 在IEEE 754浮点数运算中,当结果的尾数出现什么形式时需要进行左规,什么形式时需要进行右规

如何进行左规,如何进行右规

37.在IEEE 754浮点数运算中,如何判断浮点运算的结果是否溢出

38. 分别给出不能精确用IEEE 754单精度和双精度格式表示的最小正整数。 39.采用IEEE 754单精度浮点数格式计算下列表达式的值。

(1)+(– (2)–(–

x40. 以下是函数fpower2的C语言源程序,它用于计算2的浮点数表示,其中调用了函数u2f,u2f用于

将一个无符号整数表示的0/1序列作为float类型返回。请填写fpower2函数中的空白部分,以使其能正确计算结果。

1 float fpower2(int x) 2 {

3 unsigned exp, frac, u; 4

5 if (x< ) { /* 值太小,返回 */ 6 exp = ; 7 frac = ;

8 } else if (x< ) { /* 返回非规格化结果 */ 9 exp = ; 10 frac = ;

11 } else if (x< ) { /* 返回规格化结果 */ 12 exp = ; 13 frac = ; 14 } else { /* 值太大,返回+∞ */

15 exp = ; 16 frac = ; 17 } 18 u = exp << 23 | frac; 19 return u2f(u); 20 }

41. 以下是一组关于浮点数按位级进行运算的编程题目,其中用到一个数据类型float_bits,它被

定义为unsigned int类型。以下程序代码必须采用IEEE 754标准规定的运算规则,例如,舍入应采用就近舍入到偶数的方式。此外,代码中不能使用任何浮点数类型、浮点数运算和浮点常数,只能使用float_bits类型;不能使用任何复合数据类型,如数组、结构和联合等;可以使用无符号整数或带符号整数的数据类型、常数和运算。要求编程实现以下功能并进行正确性测试,需要针对参数f的所有32位组合情况进行处理。

(1)计算浮点数f的绝对值|f|。若f为NaN,则返回f,否则返回|f|。函数原型为: float_bits float_abs(float_bits f);

(2)计算浮点数f的负数-f。若f为NaN,则返回f,否则返回-f。函数原型为: float_bits float_neg(float_bits f);

(3)计算*f。若f为NaN,则返回f,否则返回*f。函数原型为: float_bits float_half(float_bits f);

(4)计算*f。若f为NaN,则返回f,否则返回*f。函数原型为: float_bits float_twice(float_bits f);

(5)将int型整数i的位序列转换为float型位序列。函数原型为: float_bits float_i2f(int i);

(6)将浮点数f的位序列转换为int型位序列。若f为非规格化数,则返回值为0;若f是NaN或

±∞或超出int型数可表示范围,则返回值为0x;若f带小数部分,则考虑舍入。函数原型为:

int float_f2i(float_bits f);

因篇幅问题不能全部显示,请点此查看更多更全内容