Computer science 为什么是MSB';在2'期间丢弃;补码乘法?

Computer science 为什么是MSB';在2'期间丢弃;补码乘法?,computer-science,bit,multiplication,twos-complement,Computer Science,Bit,Multiplication,Twos Complement,我很难理解为什么我们在对2的补数进行乘法时丢弃MSB 让我们以101(十进制:-3)和011(十进制:3)为例。算法是这样的:首先我们把数字的长度加倍,然后我们像在学校一样用小数进行乘法,然后我们取(加倍长度)*2=6个最低有效位 双倍长度: 101 -> 111101 011 -> 000011 做乘法: 111101*000011=10110111(十进制:-73) 正如我们所看到的,这个结果是错误的 获取6个最低有效位(删除2个最高有效位)。 10110111->11011

我很难理解为什么我们在对2的补数进行乘法时丢弃MSB

让我们以
101
(十进制:-3)和
011
(十进制:3)为例。算法是这样的:首先我们把数字的长度加倍,然后我们像在学校一样用小数进行乘法,然后我们取(加倍长度)*2=6个最低有效位

  • 双倍长度:

    101 -> 111101
    011 -> 000011
    
  • 做乘法:
    111101*000011=10110111
    (十进制:-73)

  • 正如我们所看到的,这个结果是错误的

  • 获取6个最低有效位(删除2个最高有效位)。
    10110111->110111
    (十进制:-9)

  • 所以结果就神奇地正确了。这怎么解释呢?我知道MSB是一种特殊的规则,我在学校里使用过的规则不能100%适用于2的补码,但尽管我完全理解学校的乘法规则,但我不能对2的补码乘法的最后一步(我理解的前两个步骤)掉以轻心。

    这只是关于算术。它在语义上并没有错,因为它实际上是一个正确的结果,因为在计算机中对整数的操作会导致丢弃高位,这类似于k位计算机中的模2k


    首先,您应该知道,对于具有相同位模式的无符号数和2的补码有符号数,非加宽乘法是相同的

    例如:10012 x 00112

    • 作为无符号处理,我们有9 x 3=27(0001 10112)
    • 将其视为签名,我们有-7 x 3=-21(1110 10112)†
    你可以看到一个具体的案例。对于一般情况,以2个正k位数字
    m
    n
    为例。这意味着它们的负值
    -m
    -n
    将分别用2k-m和2k-n§表示。现在我们将这两个负值相乘,得到一个k位结果:

    (-m)-n)模块2k
    =(2k-m)(2k-n)模块2k
    =[22k-2k(m+n)+mn]mod 2k
    =mn mod 2k
    =(-m)-n模2k

    如果一个数字为正,另一个为负,则情况相同

    因此,无论将两位模式视为有符号还是无符号,结果都是一样的


    现在我们有两个n位无符号数,对它们进行乘法,我们得到一个2n位的数字,因为n位数字和m位数字相乘会产生一个(n+m)位的结果

    但是如果我们只关心结果的低n位,那么它与具有相同位模式的两个n位无符号数的结果完全相同,如上所述

    所以我们取两个(n/2)位有符号数,符号扩展到n位(第一步),然后进行非加宽乘法(第二步),得到一个n位的结果。我们现在得到的和有符号加宽乘法从n/2位到n位完全相同

    将有符号操作数中的位加倍实际上只是使它们与最终结果一样宽,因此乘法现在是无符号非加宽运算,而不是像以前那样是有符号加宽运算

    †如果您注意到,如果您查看上面的证明,有符号和无符号版本的高位也会相互关联

    §因为这就是定义:

    N位数字的两个补码被定义为相对于2N的;换句话说,它是从2N中减去数字的结果


    与二进制中的1的补码和2的补码类似,在十进制中我们必须表示负数,尽管负数在日常生活中没有使用,并且超出了这个问题的范围

    这只是算术问题。它在语义上并没有错,因为它实际上是一个正确的结果,因为在计算机中对整数的操作会导致丢弃高位,这类似于k位计算机中的模2k


    首先,您应该知道,对于具有相同位模式的无符号数和2的补码有符号数,非加宽乘法是相同的

    例如:10012 x 00112

    • 作为无符号处理,我们有9 x 3=27(0001 10112)
    • 将其视为签名,我们有-7 x 3=-21(1110 10112)†
    你可以看到一个具体的案例。对于一般情况,以2个正k位数字
    m
    n
    为例。这意味着它们的负值
    -m
    -n
    将分别用2k-m和2k-n§表示。现在我们将这两个负值相乘,得到一个k位结果:

    (-m)-n)模块2k
    =(2k-m)(2k-n)模块2k
    =[22k-2k(m+n)+mn]mod 2k
    =mn mod 2k
    =(-m)-n模2k

    如果一个数字为正,另一个为负,则情况相同

    因此,无论将两位模式视为有符号还是无符号,结果都是一样的


    现在我们有两个n位无符号数,对它们进行乘法,我们得到一个2n位的数字,因为n位数字和m位数字相乘会产生一个(n+m)位的结果

    但是如果我们只关心结果的低n位,那么它与具有相同位模式的两个n位无符号数的结果完全相同,如上所述

    所以我们取两个(n/2)位有符号数,符号扩展到n位(第一步),然后进行非加宽乘法(第二步),得到一个n位的结果。我们现在得到的和有符号加宽乘法从n/2位到n位完全相同

    将有符号操作数中的位加倍实际上只是使它们与最终结果一样宽,因此乘法现在是无符号非加宽运算,而不是像以前那样是有符号加宽运算

    †如果您注意到,有符号和无符号版本的高位也会相互关联,如果您
      |
      111 111
      |   011
      -------
      |    11 
      |   11
      |  11
      |11
      11
     11
      |
    
    +-------+   +-------+   +-------+   +-------+   +-------+   +-------+    
    |000 011| + |000 110| + |001 100| + |011 000| + |110 000| + |100 000|
    +-------+   +-------+   +-------+   +-------+   +-------+   +-------+
    
    =
    
    +-------+
    |111 101| Correct result with no bits discarded (but for the sums carries)  
    +-------+
    
        111101  
        000011 x
        ------ 
        111101
       111101
      000000
     000000
    000000     +
    ----------
    0010110111
    
        111101  
        000011 x
        ------ 
    1111111101
    111111101 
    00000000
    0000000
    000000     +
    ----------
    1111110111