Jos*_*vin 23 x86 assembly x86-64 twos-complement
我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul
并且imul
?x86-64仍然如此吗?
Ste*_*non 32
加法和减法是相同的,乘法的低半部分也是如此.然而,完全相乘则不是.简单的例子:
在32位二进制补码中,-1与无符号数量2**32 - 1具有相同的表示形式.但是:
-1 * -1 = +1
(2**32 - 1) * (2**32 - 1) = (2**64 - 2**33 + 1)
Run Code Online (Sandbox Code Playgroud)
(注意两个结果的低32位是相同的;当我说"乘法的低半部分"是相同的时候,这就是我的意思).
对于2和3操作数版本,结果将是相同的,除了mul和imul指令在设置CF和OF标志(进位和溢出)的方式上有所不同.
想想这两种情况:溢出方面的-1*-1与0xFFFFFFFF*0xFFFFFFFF,你会得到这个想法.
两个16位数的乘法产生32位结果.即使其中一个数字为"1",处理器也会有效地将另一个数字扩展到32位.将数字扩展到更长的比特长度的过程是对有符号和无符号值不同的操作之一(符号重要的另一个重要操作是幅度比较,这也是除法的必要部分).
归档时间: |
|
查看次数: |
12054 次 |
最近记录: |