慕哥6287543
以下是Microsoft编译器在使用小积分常量编译除法时所执行的操作。假设一台32位机器(代码可以相应调整):int32_t div10(int32_t dividend){
int64_t invDivisor = 0x1999999A;
return (int32_t) ((invDivisor * dividend) >> 32);}这里发生的是我们乘以近似的1/10 * 2 ^ 32然后移除2 ^ 32。该方法可以适应不同的除数和不同的位宽。这对ia32架构非常有用,因为它的IMUL指令会将64位产品放入edx:eax,而edx值将是所需的值。Viz(假设股息在eax中传递,商在eax中返回)div10 proc
mov edx,1999999Ah ; load 1/10 * 2^32
imul eax ; edx:eax = dividend / 10 * 2 ^32
mov eax,edx ; eax = dividend / 10
ret
endp即使在具有慢速乘法指令的机器上,这也会比软件鸿沟更快。