Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么X86提供一对除法和乘法指令?_C_X86 - Fatal编程技术网

C 为什么X86提供一对除法和乘法指令?

C 为什么X86提供一对除法和乘法指令?,c,x86,C,X86,我注意到,unsigned int和int共享相同的加法和减法指令。但为整数除法提供idivl/imull,为无符号整数提供multiply、divl/mull。我可以知道这其中的根本原因吗?大多数微处理器使用(或类似的算法)实现乘法和除法。这当然需要单独处理操作数的符号。 虽然使用add-substract实现乘法和除法不必担心符号,因此可以互换处理有符号和无符号整数值,但它的效率要低得多,这可能就是为什么没有使用它的原因 我刚刚读到一些现代CPU交替使用该方法,但该算法也意味着断言值的符号。

我注意到,unsigned int和int共享相同的加法和减法指令。但为整数除法提供idivl/imull,为无符号整数提供multiply、divl/mull。我可以知道这其中的根本原因吗?

大多数微处理器使用(或类似的算法)实现乘法和除法。这当然需要单独处理操作数的符号。
虽然使用add-substract实现乘法和除法不必担心符号,因此可以互换处理有符号和无符号整数值,但它的效率要低得多,这可能就是为什么没有使用它的原因


我刚刚读到一些现代CPU交替使用该方法,但该算法也意味着断言值的符号。

在x86中,符号存储在字的高位(if将讨论整数和无符号整数) ADD和SUB命令对有符号和无符号in使用一种算法-它在这两种情况下都能得到正确的结果

对于MULL和DIV,这是不起作用的。您应该“告诉”CPU您想要“使用”的int是有符号的还是无符号的。 对于未签名的,使用MULL和DIV。它只操作单词,速度很快。
对于有符号的,使用MULL和IDIV。它将单词转换为绝对(正)值,为结果存储符号,然后进行运算。这比MULL和DIV慢。

乘法或除法的结果不同,具体取决于参数是有符号的还是无符号的

这真的是二的补码的魔力,它允许我们对有符号和无符号的加减运算使用相同的运算。这在其他表示法中是不正确的——一的补码和符号大小都使用与无符号算术不同的加减算法

例如,对于32位字,
-1
0xffffffff
表示。如果将其平方,则有符号和无符号版本会得到不同的结果:

Signed: -1 * -1 = 1 = 0x00000000 00000001
Unsigned: 0xffffffff * 0xffffffff = 0xfffffffe 00000001

请注意,结果的低位字是相同的。在不提供高位的处理器上,只需要一条乘法指令。在PPC上,有三条乘法指令——一条用于低位,两条用于高位,具体取决于操作数是有符号的还是无符号的。

这样做可能值得一加me注释将其与加法和减法进行对比,无论输入是否有签名,加法和减法都可以直接完成(只需要设置溢出标志,以帮助之后的人员)@达米恩:你说得很对;这个问题确实提到了加法和减法,这暗示了
加减法的思想。请看我的编辑。我正在寻找有关在CPU中实现基本算术运算的选择来源的信息,但到目前为止,没有“权威性”的信息。结果是不同的,所以如果没有两个版本,你就有麻烦了。有符号和无符号的乘法的下半部分是相同的,所以只有一个版本。在x86上,也有只给出低位字的
imul
。@harold:还有在GF(2)上运行的
imul
版本.那一个叫做
pclmulqdq
,所以我不认为这算是
imul
的版本。@harold:我实际上是在想
。哦,我以为你错过了指数,哦,好吧。同样的想法-没有写成
imul
,所以它不算