最近我对模运算符%
感到困惑。
我们知道a % b == a-a/b*b
当我们有a
和b
a > b
时,如果a
和{{{{}}}我们可以手动执行此计算1}}足够小。
但是,当谈到处理器计算方式时,处理器是否使用与前面提到的相同的方法b
?也许只是将分裂翻译成减法或加法,或者是否可能涉及一些转变?
答案 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