pNo*_*Nok 8 language-agnostic modulo
最近我对模运算符感到困惑%.
据了解,a % b == a-a/b*b当我们有一个整数a,并b在那里a > b,我们可以通过手,如果这样的计算a和b足够小.
但是,当涉及到处理器计算它的方式时,处理器是否使用与前面提到的相同的方法a-a/b*b?也许只是将分裂翻译成减法或加法,或者是否可能涉及一些转变?
除了2的幂之外,模运算符可以(并且在大多数优化编译器中)被转换为简单的按位运算,我担心唯一的方法就是难以实现.解释是http://en.wikipedia.org/wiki/Modulo_operation
在另一个答案中,@ Henk Holterman指出某些CPU在微码中执行此操作,在执行整数除法时将余数留在寄存器中,这意味着模数指令可以减少为整数除法并返回余数.(我在这里添加了这些信息,因为这个答案已经被接受了.)
它使用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