这是因为ARM架构上的除法指令需要CPU支持,而不是在软件上实现。如果除数是常数,则编译器会使用乘数逆的快速算法。如果除数不是常数,编译器将使用库函数__udivsi3来实现除法。
如果你希望避免使用库函数,可以手动使用乘数逆算法来代替除法。以下是一个示例代码:
unsigned int divide_by_constant(unsigned int n)
{
// 计算常数的乘数逆
unsigned int q = (0x80000000U + 10) / 20;
// 使用乘数逆算法进行除法
return (n * q) >> 32;
}
在这个示例中,我们使用20作为常数。计算常数的乘数逆需要一些数学技巧,这里使用了一个简单的方法来计算乘数逆。如果想了解更多的乘数逆算法,可以参考其他的资料。