对于无符号和有符号乘法,有多少最低有效位相同?

时间:2016-08-25 13:58:42

标签: assembly binary arm multiplication integer-arithmetic

例如,ARM处理器具有mul instruction,它执行32位x 32位乘法并返回结果的最低有效32位。它们还有umull and smull instructions,它再次执行32位x 32位乘法,但返回完整的64位结果。 umull执行无符号乘法运算,smull执行带符号的乘法运算。

为什么没有必要使用mul的单独未签名和签名版本?在32位x 32位乘法的情况下,假设结果中最不重要的32位在两种情况下都是相同的?正好是32位相同,还是超过32?

更一般地说,在m位x n位乘法(产生(m + n)位结果)的情况下,无符号和有符号乘法的最低有效位数是多少?

1 个答案:

答案 0 :(得分:2)

你可以用铅笔和纸做到这一点......小学风格

-1 * 3 = -3,7 * 3 = 21 smull vs umull

0b111 * 0b011

   111111
*  000011
==========
   111111
  111111
 000000
 ...
+
==========
 11111101

(从技术上讲,这些标志的扩展范围与内部的alu输入一样宽)

是-3

使用相同的3位数但使用umull

0b111 * 0b011

      000111
*     000011
=============
      000111
     000111
    000000
+  ...
==============
     0010101 

结果是21。

二元补码的美妙之处在于加减使用相同的逻辑,但乘法除以你必须符号扩展才能得到正确的答案并且存在着摩擦。未签名的符号扩展零符号签名扩展符号。将存储结果所需的位数加倍,因此需要使用32位操作数进行16位乘16的乘法,而填充到高16位的位数在有符号乘法和无符号之间变化。一旦你签署扩展,那么你肯定可以提供相同的乘法逻辑,因为那里没有差别。我想有人可能会争辩说加法和减法的工作方式也是如此,你输入相同的加法器逻辑会有所不同,这取决于加法与减法相同,你最后拉出的内容可能会有所不同(如果你将进位位反转称为借用)< / p>

现在根据你的问题,是的,如果你采用3位乘3位并且只看输出的3个低位,这几乎总是错误的答案,但无论如何都是相同的小学数学

   AAAabc
   DDDdef
=========
   AAAabc
  AAAabc
 AAAabc
AAAabc
...
===========

3x3位输入的低3位严格由原始3位输入决定,符号扩展在umull和smull之间变化不起作用。这是一个有趣的练习,但没有太多的现实世界使用,大多数操作数组合将溢出,而不是只有很高的百分比。

如果对M * N位重复此练习,则它应该是不受符号扩展影响的M或N位中的较小位。这个简单的练习留待读者阅读。