以下是函数fpower2的c语言源程序,第二章习题-ddg.doc

资料收集于网络 如有侵权请联系网站 删除 谢谢

第 二 章 习 题 答 案

1. 给出以下概念的解释说明。

真值机器数数值数据 非数值数据无符号整数带符号整数

定点数原码补码 变形补码溢出浮点数

尾数阶阶码 移码阶码下溢阶码上溢

规格化数左规右规 非规格化数机器零非数(NaN)

BCD码逻辑数 ASCII码 汉字输入码汉字内码机器字长

大端方式小端方式 最高有效位 最高有效字节(MSB)最低有效位

最低有效字节(LSB) 掩码 算术移位逻辑移位0扩展

符号扩展零标志ZF溢出标志OF 符号标志SF进位/借位标志CF

2. 简单回答下列问题。

(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) (0101 1001 0110.0011)8421 = (?)10= (?) 2= (?) 16

(4) (4E.C)16 = (?)10= (?) 2

4. 假定机器数为8位(1位符号,7位数值),写出下列各二进制数的原码表示。

+0.1001,–0.1001,+1.0,–1.0,+0.010100,–0.010100,+0,–0

5. 假定机器数为8位(1位符号,7位数值),写出下列各二进制数的补码和移码表示。

+1001,–1001,+1,–1,+10100,–10100,+0,–0

6. 已知 [x]补,求x

(1)[x]补=11100111 (2)[x]补=10000000(3)[x]补=01010010 (4)[x]补=11010011

7. 某32位字长的机器中带符号整数用补码表示,浮点数用IEEE 754标准表示,寄存器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

–1 < 0

–1 < 0U

2147483647 > –2147483647 – 1

2147483647U > –2147483647 – 1

2147483647 > (int) 2147483648U

–1 > –2

(unsigned) –1 > –2

无符号整数

有符号整数

0

1

11…1B (232–1) > 00…0B(0)

011…1B (231–1) > 100…0B (–231)

9. 在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器数(用十六进制表示)。

(1)int x=-32768 (2)short y=522(3)unsigned z=65530

(4)char [email protected](5)float a=-1.1(6)double b=10.5

10. 在32位计算机中运行一个C语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机器数(用十六进制表示)如下,请写出它们对应的真值。

(1)int x:FFFF0006H (2)short y:DFFCH(3)unsigned z:FFFFFFFAH

(4)char c:2AH5)float a:C4480000H(6)double b:C024800000000000H

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语言函数:

1void 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函数:

1void reverse_array(int a[], int len)

2 {

3int left, right=len-1;

4for (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. 假设以下表2.13中的x和y是某C语言程序中的char型变量,请根据C语言中的按位运算和逻辑运算的定义,填写表2.13,要求用十六进制形式填写。

表2.13 题15用表

x

y

x^y

x&y

x|y

~x|~y

x&!y

x&&y

x || y

!x || !y

x&&~y

0x5F

0xA0

0xC7

0xF0

0x80

0x7F

0x07

0x55

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 08mov 0x8(%ebp), %edx

80483ef: 83 c2 44add $0x44, %edx

80483f2: 8b 85 c8 fe ff ff mov 0xfffffec8(%ebp), %eax

80483f8: 89 02mov %eax, (%edx)

80483fa: 8b 45 10mov 0x10(%ebp), %eax

80483fd: 03 45 0cadd 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。

1int compare_str_len(char *str1, char *str2)

2{

3return strlen(str1) - strlen(str2) > 0;

4 }

已知C语言标准库函数strlen原型声明为“size_t strlen(const char *s);”,其中,size_t被定义为unsigned int类型。请问:函数compare_str_len在什么情况下返回的结果不正确?为什么?为使函数正确返回结果应如何修改代码?

19.考虑以下C语言程序代码:

1int func1(unsigned word)

2{

3return (int) (( word <<24) >> 24);

4}

5int func2(unsigned word)

6{

7return ( (int) word <<24 ) >> 24;

8}

假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写表2.14,并说明函数func1和func2的功能。

表2.14 题19用表

w

func1(w)

func2(w)

机器数

机器数

机器数

even if 即使值

127

128

255

256

20.填写表2.15,注意对比无符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。

表2.15 题20用表

模式

x

y

xy(截断前)

xy(截断后)

机器数

机器数

机器数

机器数

无符号

110

010

带符号

110

010

无符号

001

111

带符号

001

111

无符号

111

111

带符号

111

111

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)

尾数

S1

阶码

S1

数符

S1

7位原码数值部分

S1

8位移码

S1

1位

S1

23. 以IEEE 754单精度浮点数格式表示下列十进制数。

+1.75,+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浮点格式表示中一些重要的非负数的取值,表中已经有最大规格化数的相应内容,要求填入其他浮点数格式的相应内容。

表2.16 题26用表

项目

阶码

尾数

单精度

双精度

以2的幂次表示的值

以10的幂次表示的值

以2的幂次

表示的值

以10的幂次

表示的值

0

1

最大规格化数

最小规格化数

最大非规格化数

最小非规格化数

+∞

NaN

11111110

1…11

(2–2-23)2127

3.41038

(2–2-52)21023

1.810308

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

表示

X

x

Y

y

X+Y

x+y

OF

SF

CF

X-Y

x-y

OF

SF

CF

无符号

0xB0

0x8C

带符号

0xB0

0x8C

无符号

0x7E

0x5D

带符号

0x7E

0x5D

30. 在字长为32位的计算机上,有一个函数其原型声明为“int ch_mul_overflow(int x, int y);”,该函数用于对两个int型变量x和y的乘积判断是否溢出,若溢出则返回1,否则返回0。请使用64位精度的整数类型long long来编写该函数。

31.对于第2.7.5节中例2.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>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)0.75+(– 65.25)(2)0.75–(– 65.25)

40. 以下是函数fpower2的C语言源程序,它用于计算2x的浮点数表示,其中调用了函数u2f,u2f用于将一个无符号整数表示的0/1序列作为float类型返回。请填写fpower2函数中的空白部分,以使其能正确计算结果。

1float fpower2(int x)

2{

3unsigned exp, frac, u;

4

5if (x

6exp = ;

7frac = ;

8} else if (x< ) {/* 返回非规格化结果 */

9exp = ;

10frac = ;

11} else if (x< ) {/* 返回规格化结果 */

12exp = ;

13frac = ;

14} else {/* 值太大,返回+∞ */

15exp = ;

16frac = ;

17}

18u = exp << 23 | frac;

19return 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)计算0.5*f。若f为NaN,则返回f,否则返回0.5*f。函数原型为:

float_bits float_half(float_bits f);

(4)计算2.0*f。若f为NaN,则返回f,否则返回2.0*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型数可表示范围,则返回值为0x80000000;若f带小数部分,则考虑舍入。函数原型为:

int float_f2i(float_bits f);

精品文档

展开阅读全文

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个计算一个数的平方的C语言源程序: ```c #include <stdio.h> int main() { int num; printf("请输入一个数:"); scanf("%d", &num); int result = num * num; printf("%d的平方是%d\n", num, result); return 0; } ``` 这个程序首先让用户输入一个数,然后计算它的平方并输出结果。 ### 回答2: fpower2的C语言源程序如下所示: ```c #include <stdio.h> // 函数声明 int fpower2(int num); int main() { int num, result; printf("请输入一个整数:"); scanf("%d", &num); result = fpower2(num); printf("结果为:%d\n", result); return 0; } // 函数定义 int fpower2(int num) { return num * num; } ``` 这个程序实现了一个求给定整数的平方的函数fpower2。程序首先在主函数中接收一个整数输入,并调用fpower2函数进行计算。然后打印出计算结果。fpower2函数接收一个整数作为参数,返回该整数的平方。 程序运行时,会先从用户输入中获取一个整数,将其传递给fpower2函数进行计算,然后将结果打印出来。 ### 回答3: fpower2的C语言源程序是一个函数用于计算给定的浮点数x的2次方。 ```c #include <stdio.h> float fpower2(float x) { float result = x * x; return result; } int main() { float num; printf("请输入一个浮点数:"); scanf("%f", &num); float result = fpower2(num); printf("%.2f的2次方是:%.2f\n", num, result); return 0; } ``` 该源程序首先包含了stdio.h头文件,以便使用printf和scanf函数。然后定义了一个名为fpower2的函数,该函数以一个浮点数x作为参数,并返回计算结果(x的2次方)。在函数内部,通过将x乘以自身,得到了x的2次方,并将结果保存在result变量中。最后,函数返回result值。 在main函数中,先定义了一个浮点数num,然后使用printf函数提示用户输入一个浮点数,并通过scanf函数将用户输入的值赋给num。接下来,调用fpower2函数,将num作为参数传递给该函数,并将结果保存在result变量中。最后,使用printf函数将输出结果显示给用户。 用户可以输入一个浮点数,然后程序将计算该数的2次方,并将结果输出给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值