我想要一些C语言,让我用指定的舍入行为进行有效的整数除法,如下所示:
div_down(-4,3) ==> -2 div_up(4,3) ==> 2 div_to_zero(-4,3) ==> -1 div_to_nearest(5,3) ==> 2
我希望它能够在编译时检测目标机器的行为并生成适当的最佳实现.类似于模数的东西也会很好,在编译时抽象出负操作数的未定义行为.
这存在吗?
如果没有,有什么好办法呢?我可以想到几种可能的方法:
>尝试将它们实现为静态优化的单个表达式
>使用常量表达式来检测目标行为,并从多个实现中进行选择,使用模板进行选择(但具体如何?)
解决方法
这是我到目前为止所得到的,前提条件d>它们似乎都有效,但它们可以简化吗?
int div_down(int n,int d) { if (n < 0) { return -((d - n - 1) / d); } else { return n / d; } } int div_up(int n,int d) { if (n < 0) { return -(-n / d); } else { return (n + d - 1) / d; } } int div_to_zero(int n,int d) { return n / d; } int div_to_nearest(int n,int d) { if (n < 0) { return (n - d/2 + 1) / d; } else { return (n + d/2) / d; } }