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

use*_*783 2 binary assembly arm multiplication integer-arithmetic

例如,ARM 处理器有一条mul指令,它执行 32 位 x 32 位乘法并返回结果的最低有效 32 位。它们还有umullsmull指令,再次执行 32 位 x 32 位乘法,但返回完整的 64 位结果。umull进行无符号乘法,并smull进行有符号乘法。

为什么不需要单独的未签名和签名版本mul?在 32 位 x 32 位乘法的情况下,结果的最低有效 32 位在这两种情况下可能是相同的?32 位是完全相同的还是比 32 位更多?

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

old*_*mer 5

你可以用铅笔和纸来做这个...小学风格

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

0b111*0b011

   111111
*  000011
==========
   111111
  111111
 000000
 ...
+
==========
 11111101
Run Code Online (Sandbox Code Playgroud)

(从技术上讲,符号的扩展范围与内部 alu 输入一样宽)

这是-3

采用相同的 3 位数字,但使用 umull

0b111*0b011

      000111
*     000011
=============
      000111
     000111
    000000
+  ...
==============
     0010101 
Run Code Online (Sandbox Code Playgroud)

结果是 21。

二进制补码的美妙之处在于,加法和减法使用相同的逻辑,但乘法和除法必须符号扩展才能得到正确的答案,这就是问题所在。无符号符号扩展零,有符号符号扩展符号。最差情况下乘以存储结果所需位数的两倍,因此需要使用 32 位操作数来完成 16 位乘 16 乘法,并且填充到高 16 位的内容在有符号乘法和无符号乘法之间有所不同。一旦你签署了扩展,那么确保你可以提供相同的乘法逻辑,因为那里没有区别。我想有人可能会争辩说,这也是加法和减法的工作原理,您输入相同的加法器逻辑的内容会根据加法与减法的不同而变化,同样,您最后取出的内容也可能会有所不同(如果您反转进位位将其称为借位)

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

   AAAabc
   DDDdef
=========
   AAAabc
  AAAabc
 AAAabc
AAAabc
...
===========
Run Code Online (Sandbox Code Playgroud)

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

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