深入理解计算机系统第二版家庭作业答案Word格式.docx

上传人:b****4 文档编号:14316129 上传时间:2022-10-22 格式:DOCX 页数:31 大小:33.91KB
下载 相关 举报
深入理解计算机系统第二版家庭作业答案Word格式.docx_第1页
第1页 / 共31页
深入理解计算机系统第二版家庭作业答案Word格式.docx_第2页
第2页 / 共31页
深入理解计算机系统第二版家庭作业答案Word格式.docx_第3页
第3页 / 共31页
深入理解计算机系统第二版家庭作业答案Word格式.docx_第4页
第4页 / 共31页
深入理解计算机系统第二版家庭作业答案Word格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

深入理解计算机系统第二版家庭作业答案Word格式.docx

《深入理解计算机系统第二版家庭作业答案Word格式.docx》由会员分享,可在线阅读,更多相关《深入理解计算机系统第二版家庭作业答案Word格式.docx(31页珍藏版)》请在冰豆网上搜索。

深入理解计算机系统第二版家庭作业答案Word格式.docx

3));

2.61

A.!

~x

B.!

x

C.!

~(x>

>

((sizeof(int)-1)<

3))

D.!

0xFF)

注意,英文版中C是最低字节,D是最高字节。

中文版恰好反过来了。

这里是按中文版来做的。

2.62

这里我感觉应该是英文版对的,int_shifts_are_arithmetic()

int_shifts_are_arithmetic(){

x= 

-1;

(x>

1) 

== 

2.63

对于sra,主要的工作是将xrsl的第w-k-1位扩展到前面的高位。

这个可以利用取反加1来实现,不过这里的加1是加1<

(w-k-1)。

如果x的第w-k-1位为0,取反加1后,前面位全为0,如果为1,取反加1后就全是1。

最后再使用相应的掩码得到结果。

对于srl,注意工作就是将前面的高位清0,即xsra&

(1<

(w-k)-1)。

额外注意k==0时,不能使用1<

(w-k),于是改用2<

sra(int 

k){

xsrl= 

(unsigned) 

k;

w= 

sizeof(int)<

3;

unsignedz= 

(w-k-1);

unsignedmask=z 

unsignedright=mask 

xsrl;

unsignedleft= 

~mask 

(~(z&

xsrl) 

z);

left 

right;

srl(unsignedx, 

xsra= 

(int) 

sizeof(int)*8;

(z 

xsra;

2.64

any_even_one(unsignedx){

!

(0x55555555));

2.65

even_ones(unsignedx){

^= 

(x>

16);

8);

4);

2);

1);

x的每个位进行异或,如果为0就说明是偶数个1,如果为1就是奇数个1。

那么可以想到折半缩小规模。

最后一句也可以是return(x^1)&

1

2.66

根据提示想到利用或运算,将最高位的1或到比它低的每一位上,忽然想如果x就是10000000..该如何让每一位都为1。

于是便想到了二进扩展。

先是x右移1位再和原x进行或,变成1100000...,再让结果右移2位和原结果或,变成11110000...,最后到16位,变成11111111...。

leftmost_one(unsignedx){

|= 

x^(x>

2.67

A.32位机器上没有定义移位32次。

B.beyond_msb变为2<

31。

C.定义a=1<

15;

a<

=15;

set_msb=a<

beyond_msb=a<

2;

2.68

感觉中文版有点问题,注释和函数有点对应不上,于是用英文版的了。

个人猜想应该是让x的最低n位变1。

lower_one_mask(int 

n){

(2<

(n-1)) 

2.69

rotate_right(unsignedx, 

sizeof(unsigned)*8;

n) 

(x<

(w-n-1)<

2.70

这一题是看x的值是否在-2^(n-1)到2^(n-1)-1之间。

如果x满足这个条件,则其第n-1位就是符号位。

如果该位为0,则前面的w-n位均为0,如果该位为1,则前面的w-n位均为1。

所以本质是判断,x的高w-n+1位是否为0或者为-1。

fits_bits(int 

(n-1);

|| 

(~x);

2.71

A.得到的结果是unsigned,而并非扩展为signed的结果。

B.使用int,将待抽取字节左移到最高字节,再右移到最低字节即可。

xbyte(unsignedword, 

bytenum){

ret=word 

((3 

bytenum)<

3);

ret 

24;

2.72

A.size_t是无符号整数,因此左边都会先转换为无符号整数,它肯定是大于等于0的。

B.判断条件改为if(maxbytes>

0&

maxbytes>

=sizeof(val))

2.73

请先参考2.74题。

可知:

t=a+b时,如果a,b异号(或者存在0),则肯定不会溢出。

如果a,b均大于等于0,则t<

0就是正溢出,如果a,b均小于0,则t>

=0就是负溢出。

于是,可以利用三个变量来表示是正溢出,负溢出还是无溢出。

saturating_add(int 

y){

sizeof(int)<

3;

t=x 

y;

ans=x 

x>

=(w-1);

y>

t>

pos_ovf= 

~x&

~y&

t;

neg_ovf=x&

y&

~t;

novf= 

~(pos_ovf|neg_ovf);

(pos_ovf&

INT_MAX) 

(novf&

ans) 

(neg_ovf&

INT_MIN);

2.74

对于有符号整数相减,溢出的规则可以总结为:

t=a-b;

如果a,b同号,则肯定不会溢出。

如果a>

=0&

b<

0,则只有当t<

=0时才算溢出。

如果a<

0&

b>

=0,则只有当t>

不过,上述t肯定不会等于0,因为当a,b不同号时:

1)a!

=b,因此a-b不会等于0。

2)a-b<

=abs(a)+abs(b)<

=abs(TMax)+abs(TMin)=(2^w-1)

所以,a,b异号,t,b同号即可判定为溢出。

tsub_ovf(int 

=y)&

(y==t);

顺便整理一下汇编中CF,OF的设定规则(个人总结,如有不对之处,欢迎指正)。

t=a+b;

CF:

(unsignedt)<

(unsigneda)进位标志

OF:

(a<

0==b<

0)&

(t<

0!

=a<

0)

t=a-b;

=0)||((a<

t<

0)退位标志

=b<

(b<

0==t<

汇编中,无符号和有符号运算对条件码(标志位)的设定应该是相同的,但是对于无符号比较和有符号比较,其返回值是根据不同的标志位进行的。

详情可以参考第三章3.6.2节。

2.75

根据2-18,不难推导,(x'

*y'

)_h=(x*y)_h+x(w-1)*y+y(w-1)*x。

unsigned_high_prod(unsignedx, 

unsignedy){

signed_high_prod(x, 

y) 

(w-1))*y 

x*(y>

(w-1));

当然,这里用了乘法,不属于整数位级编码规则,聪明的办法是使用int进行移位,并使用与运算。

即((int)x>

(w-1))&

y和((int)y>

x。

注:

不使用longlong来实现signed_high_prod(intx,inty)是一件比较复杂的工作,而且我不会只使用整数位级编码规则来实现,因为需要使用循环和条件判断。

下面的代码是计算两个整数相乘得到的高位和低位。

uadd_ok(unsignedx, 

=x;

void 

signed_prod_result(int 

y, 

h, 

l){

h= 

0;

l= 

(y&

1)?

x:

for(int 

i=1;

i<

w;

i++){

if( 

(y>

i)&

) 

+= 

(unsigned)x>

(w-i);

if(!

uadd_ok(l, 

x<

i)) 

h++;

i);

h=h 

((x>

(w-1))*y) 

((y>

(w-1))*x);

最后一步计算之前的h即为unsigned相乘得到的高位。

sign_h=unsign_h-((x>

y)-((y>

x);

sign_h=unsign_h+((x>

(w-1))*y)+((y>

(w-1))*x);

2.76

A.K=5:

(x<

2)+x

B.K=9:

3)+x

C.K=30:

5)-(x<

1)

D.K=-56:

3)-(x<

6)

2.77

先计算x>

k,再考虑舍入。

舍入的条件是x<

0&

x的最后k位不为0。

divide_power2(int 

ans=x>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1