web-dev-qa-db-fra.com

Quel est le comportement de la division entière?

Par exemple,

int result;

result = 125/100;

ou

result = 43/100;

Le résultat sera-t-il toujours le sol de la division? Quel est le comportement défini?

188
T.T.T.

Le résultat sera-t-il toujours le sol de la division? Quel est le comportement défini?

Oui, quotient entier des deux opérandes.

6.5.5 Opérateurs multiplicatifs

6 Lorsque les entiers sont divisés, le résultat de l'opérateur/est le quotient algébrique, toute partie décimale étant ignorée.88) Si le quotient a/b est représentable, l'expression (a/b) * b + a% b doit être égale à a.

et la note de bas de page correspondante:

88) On l’appelle souvent ‘‘ troncature vers zéro ’’.

Bien sûr, deux points à noter sont:

Les conversions arithmétiques habituelles sont effectuées sur les opérandes.

et:

5 Le résultat de l'opérateur/est le quotient de la division du premier opérande par le second; le résultat de l'opérateur% est le reste. Dans les deux opérations, si le deuxième opérande a la valeur zéro, le comportement est indéfini.

[Note: Souligne moi]

163
dirkgently

Dirkgently donne ne excellente description de la division entière en C99, mais vous devez également savoir qu'en C89, la division entière avec un opérande négatif a un sens défini par la mise en oeuvre.

Extrait du brouillon ANSI C (3.3.5):

Si l'un des opérandes est négatif, que le résultat de l'opérateur/soit le plus grand nombre entier inférieur au quotient algébrique ou que le plus petit entier supérieur au quotient algébrique soit défini par l'implémentation, comme le signe du résultat de l'opérateur%. Si le quotient a/b est représentable, l'expression (a/b) * b + a% b doit être égale à a.

Alors surveillez les nombres négatifs lorsque vous êtes coincé avec un compilateur C89.

C99 est un fait amusant que C99 a choisi la troncature vers zéro car c’est ainsi que FORTRAN l’a fait. Voir ce message sur comp.std.c.

39
schot

Lorsque le résultat est négatif, C tronque vers 0 plutôt que sur le sol. J'ai appris cette lecture sur la raison pour laquelle Python division entière toujours les étages ici: Pourquoi les planchers de division entière de Python

21
Gareth Williams

Oui, le résultat est toujours tronqué vers zéro. Il arrondira à la plus petite valeur absolue.

-5 / 2 = -2
 5 / 2 =  2

Pour les valeurs signées non signées et non négatives, il s'agit de la même chose que floor (arrondi à -Infinity).

18
Leonid

Le résultat sera-t-il toujours le sol de la division?

Non, le résultat varie, mais la variation ne se produit que pour les valeurs négatives.

Quel est le comportement défini?

Pour que le sol soit bien arrondi à l'infini négatif, alors que la division entière est arrondie à zéro (tronquée)

Pour les valeurs positives, ce sont les mêmes

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

Pour la valeur négative c'est différent

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
12
Muhammad Annaqeeb