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

pNo*_*Nok 8 language-agnostic modulo

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

据了解,a % b == a-a/b*b当我们有一个整数a,并b在那里a > b,我们可以通过手,如果这样的计算ab足够小.

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

Pau*_*lin 8

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

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


Ste*_*ens 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 
Run Code Online (Sandbox Code Playgroud)

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

  • 我怀疑它会在ARM或摩托罗拉CPU上做到这一点.但这是一个有效的例子. (2认同)
  • 那将是一个硬件问题.您需要在另一个论坛上发布该问题. (2认同)