模数运算符(%)如何实际计算?

时间:2011-10-09 13:20:20

标签: language-agnostic modulo

最近我对模运算符%感到困惑。

我们知道a % b == a-a/b*b当我们有ab a > b时,如果a和{{{{}}}我们可以手动执行此计算1}}足够小。

但是,当谈到处理器计算方式时,处理器是否使用与前面提到的相同的方法b?也许只是将分裂翻译成减法或加法,或者是否可能涉及一些转变?

2 个答案:

答案 0 :(得分:8)

除了2的幂,其中模运算符可以(并且在大多数优化编译器中)被转换为简单的按位运算,我担心唯一的方法就是难以实现。解释是http://en.wikipedia.org/wiki/Modulo_operation

在另一个答案中,@ Henk Holterman指出某些CPU在微码中执行此操作,在执行整数除法时将余数留在寄存器中,这意味着模数指令可以减少为整数除法并返回余数。 (我在这里添加了这些信息,因为这个答案已经被接受了。)

答案 1 :(得分:5)

它使用 idiv 汇编指令:

    int x = a % b;
00000050  cmp         dword ptr [rsp+20h],80000000h 
00000058  jne         0000000000000061 
0000005a  cmp         dword ptr [rsp+24h],0FFFFFFFFh 
0000005f  je          0000000000000070 
00000061  mov         eax,dword ptr [rsp+20h] 
00000065  cdq              
00000066  idiv        eax,dword ptr [rsp+24h] 
0000006a  mov         dword ptr [rsp+2Ch],edx 
0000006e  jmp         0000000000000075 
00000070  call        FFFFFFFFF2620E70 
00000075  mov         eax,dword ptr [rsp+2Ch] 
00000079  mov         dword ptr [rsp+28h],eax 

idiv将剩余部分存储在寄存器中 http://pdos.csail.mit.edu/6.828/2007/readings/i386/IDIV.htm