深入理解计算机系统第二版 家庭作业答案Word格式文档下载.docx
- 文档编号:13462361
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:87
- 大小:252.45KB
深入理解计算机系统第二版 家庭作业答案Word格式文档下载.docx
《深入理解计算机系统第二版 家庭作业答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《深入理解计算机系统第二版 家庭作业答案Word格式文档下载.docx(87页珍藏版)》请在冰豆网上搜索。
(b
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)
x
k;
w=
sizeof(int)<
3;
unsignedz=
1
(w-k-1);
unsignedmask=z
-
unsignedright=mask
xsrl;
unsignedleft=
~mask
(~(z&
xsrl)
+
z);
left
right;
srl(unsignedx,
xsra=
(int)
sizeof(int)*8;
2
(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,
y
=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)&
)
h
+=
(unsigned)x>
(w-i);
if(!
uadd_ok(l,
x<
i))
h++;
l
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
a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入理解计算机系统第二版 家庭作业答案 深入 理解 计算机系统 第二 家庭 作业 答案