Quel est le but de la fonction de bibliothèque div ()?

Quand c a l’opérateur / pour diviser deux nombres, à quoi sert la fonction de bibliothèque div () ?

Existe-t-il un scénario où / ne peut être utilisé mais que div() peut?

Du document de justification C99:

(7.20.6.2 Les fonctions div, ldiv et lldiv) Etant donné que C89 avait une sémantique définie par l’implémentation pour la division des entiers signés lorsque des opérandes négatives étaient impliquées, div et ldiv et lldiv en C99 ont été inventés pour fournir une sémantique bien spécifiée pour division entière et autres opérations. La sémantique a été adoptée pour être la même que dans Fortran. Comme ces fonctions renvoient à la fois le quotient et le rest, elles constituent également un moyen pratique de modéliser efficacement le matériel sous-jacent qui calcule les deux résultats dans le cadre d’une même opération. […] Maintenant que C99 requirejs une sémantique similaire pour l’opérateur de division, les nouveaux programmes utilisant div, ldiv ou lldiv sont principalement motivés par l’obtention simultanée du quotient et du rest.

div_t est une structure qui contient un membre quotient et un membre restant. Par exemple :

 typedef struct { int quot; int rem; } div_t; 

Certaines implémentations simples de la fonction div utilisent les opérateurs / et % . Vous pouvez également voir ce sujet .

div() renvoie le result de la division et le remainder . Donc, vous n’avez pas besoin d’utiliser l’opérateur % pour trouver le remainder .

Comme d’autres personnes l’ont mentionné, div() vous donnera à la fois le quotient et le rest. Cela est dû au fait que l’algorithme de division entier (logiciel) utilisé par la plupart des environnements d’exécution C calcule les deux en même temps.

Si l’ordinateur cible n’a pas de diviseur matériel, l’opérateur / est alors transformé en appel à div() et le rest est jeté. La même chose se produit avec l’opérateur % sauf que c’est le quotient qui est jeté. Donc, si vous faites quelque chose comme ça:

 quot = a / b; rem = a % b; 

vous appelez la routine de division à deux resockets (et la division est assez lente si votre ordinateur ne le fait pas matériellement). C’est donc plus rapide d’utiliser div() pour obtenir les deux.

(Bien sûr, il est également moins lisible et le gain de performance dépend de votre plate-forme et de votre compilateur. Vous ne devriez jamais passer à div() si vous avez déterminé qu’il s’agit d’un goulot d’étranglement. Rappelez-vous ce que Knuth a dit à propos de Prématuré. optimisation.)