我正在阅读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 < 0sox_31 = 1,加上y?与y相同。

最佳答案

要执行位级乘法,我们必须先扩展位,然后进行一系列移位和加法运算。例如,假设w=3,设x = [011]y = [101]。(即x = 3y = -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]

07-28 02:02
查看更多