div()库函数的目的是什么?
当c使用/
运算符来划分两个数时,具有div()库函数的目的是什么?
是否存在/
不能使用但div()
可以使用的场景?
从C99理由文件:
(7.20.6.2 div,ldiv和lldiv函数)因为当涉及负操作数时,C89具有用于划分有符号整数的实现定义语义,所以发明了C99中的div和ldiv以及lldiv,以便为签名提供明确指定的语义。整数除法和余数运算。 采用的语义与Fortran中的语义相同。 由于这些函数同时返回商和余数,因此它们还可以作为有效建模底层硬件的便捷方式,这些硬件将两个结果作为同一操作的一部分进行计算。 […]既然C99要求除法运算符具有相似的语义,新程序使用div,ldiv或lldiv的主要原因是同时获得商和余数。
div_t
是一个结构,包含商成员和余数成员。 例如 :
typedef struct { int quot; int rem; } div_t;
div
函数的一些简单实现使用/
和%
运算符。 您还可以看到此主题 。
div()
返回除法的result
和 remainder
。 因此,您不必使用%
运算符来查找remainder
。
正如其他人提到的那样, div()
会给你商和余数。 这是因为大多数C运行时使用的(软件)整数除法算法同时计算两者。
如果目标计算机没有硬件分隔符,则/
运算符通常会变为对div()
的调用,其余部分将被丢弃。 %
运算符也会发生同样的事情,除了它是被抛出的商。 所以,如果你正在做这样的事情:
quot = a / b; rem = a % b;
你正在调用除法程序两次(如果你的计算机没有在硬件中执行,则除法很慢)。 因此使用div()
来获取两者都会更快。
(当然,它的可读性也较低,你是否真正获得任何性能优势取决于你的特定平台和编译器。如果你确定它是性能瓶颈,你应该只切换到div()
。记住Knuth所说的过早性优化。)