最近我对取模运算符%
感到困惑。
已知当我们有整数a
和b
,其中a > b
时,a % b == a-a/b*b
。如果a
和b
足够小,我们可以手动进行这个计算。
然而,当涉及到处理器的计算方式时,处理器是否使用与之前提到的相同方法a-a/b*b
?也许只是通过将除法转换为减法或加法,或者可能涉及一些移位吗?
最近我对取模运算符%
感到困惑。
已知当我们有整数a
和b
,其中a > b
时,a % b == a-a/b*b
。如果a
和b
足够小,我们可以手动进行这个计算。
然而,当涉及到处理器的计算方式时,处理器是否使用与之前提到的相同方法a-a/b*b
?也许只是通过将除法转换为减法或加法,或者可能涉及一些移位吗?
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