当C使用/运算符将两个数相除时,使用div() library function的目的是什么?
是否存在不能使用/而可以使用div()的情况?
发布于 2012-07-31 00:51:43
来自C99基本原理文档:
(7.20.6.2 div、ldiv和lldiv函数)因为C89在涉及负操作数时具有用于有符号整数除法的实现定义语义,所以发明了C99中的div和ldiv以及lldiv,以便为有符号整数除法和余数运算提供明确指定的语义。采用了与Fortran相同的语义。由于这些函数同时返回商和余数,因此它们还可以作为一种方便的方法,有效地对底层硬件进行建模,将这两个结果作为同一操作的一部分进行计算。..。既然C99要求除法运算符具有类似的语义,那么新程序使用div、ldiv或lldiv的主要原因是为了同时获得商和余数。
发布于 2018-11-10 11:09:01
引用自C Programming: A Modern Approach, 2nd Edition,26章,问答部分。
问:为什么会存在div和ldiv函数?我们不能只使用/和%运算符吗?
答:div和ldiv与/和%不太一样。回想一下4.1节,将/和%应用于负操作数不会在C89中给出可移植的结果。如果i或j为负,则i / j的值是向上还是向下舍入是实现定义的,也是i % j的符号。由div和ldiv计算的答案,另一方面,不依赖于实现。商被舍入到零;余数根据公式n = q x d + r计算,其中n是原始数,q是商,d是除数,r是余数。这里有几个例子:
N|d|q|r-|-| -7 |3|2|1 -7 |3| -2 | -1 7| -3 | -2 |1-7| -3 | -1
在C99中,/和%运算符是保证的,以产生与div和ldiv相同的结果。
效率是div和ldiv存在的另一个原因。许多机器都有一个既可以计算商又可以计算余数的指令,因此调用div或ldiv可能比单独使用/和%运算符更快。
发布于 2012-07-31 00:45:43
div_t是一个结构,它包含一个商成员和一个余数成员。例如:
typedef struct {
int quot;
int rem;
} div_t;div函数的一些简单实现使用/和%运算符。您还可以查看this topic。
https://stackoverflow.com/questions/11725884
复制相似问题