整数除法/和模%运算通常在编程中一起使用,有时甚至在相同的操作数和后续行中使用.例如,下面的C函数是一个简单的函数,它将/2个数字的结果与它们的结果相加%,就是这样:
int sum2digits(int x, int base) {
int n, m;
n = x / base;
m = x % base;
return n + m;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,双方/并%通过(在x86)的同一台机器的指令执行.说,如果为整数除法(执行机器指令div或idiv两个数字的),a和b,然后之后的值a / b将被存储在寄存器EAX,其余a % b在EDX.
我想知道编译器是否利用了这种质量并看了一下汇编代码.事实证明,使用gcc进行正常编译并不能优化:
push %rbp
mov %rsp,%rbp
mov %edi,-0x14(%rbp)
mov %esi,-0x18(%rbp)
mov -0x14(%rbp),%eax
mov %eax,%edx
sar $0x1f,%edx
idivl -0x18(%rbp)
mov %eax,-0x8(%rbp)
mov -0x14(%rbp),%eax
mov %eax,%edx
sar $0x1f,%edx
idivl …Run Code Online (Sandbox Code Playgroud)