计算机系统基础_作业2
2.75
针对补码乘法,我们得到如下式子:
其中的mod2^w 相当于截取前w位的操作,那么我们取高w位,则只需将取模运算改为除法。
得到:
于是我们的代码如下:
1 |
|
2.77
A:对于 x*17 = x * (2^4 + 2^0) = x * 2^4 + x = x << 4 + x << 0 = x << 4 + x
1 |
|
B: 对于 x*-7 = -(x * 2^3 - x * 2^0) = -(x<<3)+x
1 |
|
C:对于 x * (64 - 4) = x * (2^6 - 2^2) = x << 6 - x << 2
1 |
|
D:对于 x * -(128 - 16) = x * -(2^7 - 2^4) = -(x << 7 - x << 4) = -(x<<7)+(x<<4)
1 |
|
2.79
1 |
|
我们通过一下代码来测试:
1 |
|
运行结果为:
2.82
A.
错,当 x = INT_MIN,y = 0
时 x = -x
仍然等于-2147483648,y = -y 仍然等于0 则 -2147483648<0 == -2147483648 > 0
显然为0
B
对,x<<4 -x + y<<4 + y = x*(2^4 - 1) + y*(2^4 + 1) = x*15 + y*17
C
对
~x + ~y + 1 = -(x + 1) + -(y + 1) + 1 = -x - 1 - y - 1 + 1 = -x - y - 1 + 1 = -x - y -1
~(x + y) = -(x + y + 1)
~x + ~y + 1 == ~(x + y)
D
对
unsigned x - unsigned y = -(unsigned)(y-x)
无符号数减法时,若x<y,结果会发生下溢,计算为x-y+w
考虑情况:
1、x>=y
ux−uy=x−y
而 −(unsigned(y−x)) 的结果为:
−(unsigned(y−x))=−(2^w + y−x)=2^w + x - y = x-y
2、x<y
unsigned x- unsigned y= x - y + 2^w
−(unsigned(y−x))= -U(y-x) = 2^w - (y -x) = 2^w -x +y
两种情况下都成立,故等式恒成立
E
对
((x>>2)<<2)<=x
右移两位后左移,最低两位一定被丢弃且无法恢复