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的主要原因是同时获得商和余数.
引自C 编程:现代方法,第二版,第 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
Run Code Online (Sandbox Code Playgroud)n | d | q | r --------|--------|--------|-------- 7 | 3 | 2 | 1 -7 | 3 | -2 | -1 7 | -3 | -2 | 1 -7 | -3 | 2 | -1
在 C99 中,
/
and%
运算符保证产生与div
和相同的结果ldiv
。
div
效率是存在的另一个原因ldiv
。许多机器都有一条可以计算商和余数的指令,因此调用div
orldiv
可能比单独使用and运算符更快。/
%