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)位结果)的情况下,无符号和有符号乘法的最低有效位数是多少?
答案 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位中的较小位。这个简单的练习留待读者阅读。