Computer science 为什么是MSB';在2'期间丢弃;补码乘法?
我很难理解为什么我们在对2的补数进行乘法时丢弃MSB 让我们以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
101
(十进制:-3)和011
(十进制:3)为例。算法是这样的:首先我们把数字的长度加倍,然后我们像在学校一样用小数进行乘法,然后我们取(加倍长度)*2=6个最低有效位
101 -> 111101
011 -> 000011
111101*000011=10110111
(十进制:-73)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)†
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)†
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