我正在阅读CSAPP并试图完成作业问题。假设w=32,2.75是从两个32位无符号整数相乘得到高32位。给定计算x的高阶32位的函数int signed_high_prod(int x, int y)
。y表示x和y是二补形式的情况。int signed_high_prod(int x, int y)
应该用于实现unsigned int unsigned_high_prod(unsigned x, unsigned y)
。
通过google我发现了x'.y' = x.y + x.y_31.2^32 + y.x_31.2^32 + x_31.y_31.2^64
,其中x'和y'分别是x和y的无符号形式。
我还是不明白答案。
unsigned unsigned_high_prod(unsigned x, unsigned y){
unsigned p = (unsigned) signed_high_prod((int) x, (int) y)
if((int) x < 0){
p += y;
}
if((int) y < 0){
p += x;
}
return p;
}
为什么期末考试对成绩没有影响?为什么当
x < 0
sox_31 = 1
,加上y
?与y
相同。 最佳答案
要执行位级乘法,我们必须先扩展位,然后进行一系列移位和加法运算。例如,假设w=3,设x = [011]
和y = [101]
。(即x = 3
和y = -3 (signed) or 5 (unsigned)
)
为了执行无符号乘积,我们首先将零扩展如下:(忽略位6及以上)
000 011
* 000 101
--------
000 011
+ 001 100
--------
001 111
========
因此,无符号高阶位
[001]
为了执行签署的产品,我们首先签署扩展如下:
000 011
* 111 101
--------
000 011
+ 001 100
+ 011 000 **
+ 110 000 **
+ 100 000 **
--------
110 111
========
因此,有符号的高阶位是
[110]
注意,有符号高位和无符号高位(如上面**所示)的区别在于,我们在有符号的情况下添加了
[111] * [011]
。因此,我们必须减去这个量才能得到无符号的高阶位。The unsigned high order bits = [110] - [111] * [011]
= [110] - [101]
= [110] + [011] ??
= [001] (as above)
因为
[111] = -1
,所以校正量- [111] * [011]
等于- (-1 * x) = x
。因此,当
y
为负时(在本例中),我们必须通过添加x
来更正结果。简单地说,当x
为负时,我们必须通过添加y
来更正结果。?? -[101] = ~[101] + 1 = [010] + [001] = [011]