div()库函数的目的是什么?

Eig*_*ght 3 c division standard-library

当c让/操作符分割两个数字时,拥有div()库函数的目的是什么?

是否有任何情况div()不能使用但/可以?

oua*_*uah 13

从C99理由文件:

(7.20.6.2 div,ldiv和lldiv函数)因为当涉及负操作数时,C89具有用于划分有符号整数的实现定义语义,所以发明了C99中的div和ldiv以及lldiv,以便为签名提供明确指定的语义.整数除法和余数运算.采用的语义与Fortran中的语义相同.由于这些函数同时返回商和余数,因此它们还可以作为有效建模底层硬件的便捷方式,这些硬件将两个结果作为同一操作的一部分进行计算.[...]既然C99要求除法运算符具有相似的语义,新程序使用div,ldiv或lldiv的主要原因是同时获得商和余数.


mja*_*mja 6

引自C 编程:现代方法,第二版,第 26 章,问答部分。

问:为什么会有 div 和 ldiv 函数?我们不能只使用 / 和 % 运算符吗?

答:div和与和ldiv不太一样。回想一下 4.1 节,在 C89 中将和应用于负操作数不会给出 可移植的结果。如果或为负数,则 的值 是向上舍入还是向下舍入由实现定义, 的符号也是如此 。另一方面, 由和计算的答案不依赖于实现。商向零舍入;余数根据公式 计算,其中是原数,是商,是除数,是余数。这里有一些例子:/%/%iji / ji % jdivldivn = q x d + rnqdr

 n      |  d     |  q     |  r
--------|--------|--------|--------
 7      |  3     |  2     |  1
-7      |  3     | -2     | -1
 7      | -3     | -2     |  1
-7      | -3     |  2     | -1
Run Code Online (Sandbox Code Playgroud)

在 C99 中,/and%运算符保证产生与 div和相同的结果ldiv

div效率是存在的另一个原因ldiv。许多机器都有一条可以计算商和余数的指令,因此调用div orldiv可能比单独使用and运算符更快/%