Il me semble me souvenir que ANSI C ne spécifiait pas quelle valeur devrait être retournée lorsque l'un des opérandes d'un opérateur modulo est négatif (juste qu'il devrait être cohérent). Est-ce que cela a été précisé plus tard, ou a-t-il été précisé et je me souviens mal?C ANSI C ou ISO C spécifie-t-il ce que -5% 10 devrait être?
Répondre
C89, pas totalement (§ 3.3.5/6). Il peut être soit -5 ou 5, car -5/10 peut retourner 0 ou -1 (%
est définie en termes d'une équation linéaire impliquant /
, *
et +
):
Lorsque des nombres entiers sont divisés et la la division est inexacte, si les deux opérandes sont positifs, le résultat de l'opérateur
/
est le plus grand entier inférieur au quotient algébrique et le résultat de l'opérateur%
est positif. Si l'un des opérandes est négatif, si le résultat de l'opérateur/
est le plus grand entier inférieur au quotient algébrique ou le plus petit nombre entier supérieur au quotient algébrique est défini par l'implémentation, comme cela est le signe du résultat de la%
opérateur. Si le quotienta/b
est représentable, l'expression(a/b)*b + a%b
doit être égale àa
.
C99, oui (§ 6.5.5/6), le résultat doit être -5:
Lorsque des nombres entiers sont divisés, le résultat de l'opérateur
/
est le quotient algébrique avec une partie fractionnaire mis au rebut. 88) Si le quotienta/b
est représentable, l'expression(a/b)*b + a%b
doit être égale àa
. 88) Ceci est souvent appelé "troncature vers zéro".
De même, dans 98 le résultat C de est mise en oeuvre définie (§ 5,6/4), suivant la définition de C89, mais mentionne que la règle ronde vers zéro est préféré,
... Si les deux opérandes sont non négatifs, le reste est non négatif; sinon, le signe du reste est défini par l'implémentation 74).
74) Selon les travaux en cours vers la révision de l'ISO C, l'algorithme préféré pour la division entière suit les règles définies dans la norme ISO Fortran, 1539 ISO/IEC: 1991, dans lequel le quotient est toujours arrondi vers zéro.
et en effet, il devient la règle standard C++ 0x (§ 5.6/4):
... Pour opérandes intégrantes l'opérateur
/
donne le quotient algébrique avec une partie fractionnaire mis au rebut ; ...82) Ceci est souvent appelé troncature vers zéro.
Pour ajouter un petit détail à la réponse de KennyTM: Si quelque chose C Normes appellent la mise en œuvre définie alors que la mise en œuvre est nécessaire pour documenter le choix qu'il fait. Habituellement, cela se trouve dans la documentation du compilateur ou de la bibliothèque (page de manuel, manuel d'aide, documentation imprimée, livret de CD :-) Toute implémentation revendiquant la conformité à C89 ou plus tard doit fournir quelque part. Essayez de chercher un tel document. Dans le cas de gcc
par exemple, cela est dans le gcc-info:
4 C Comportement défini par l'implémentation-
est nécessaire Une mise en œuvre conforme de la norme ISO C pour documenter son choix du comportement dans chacune des zones désignées "implémentation définie". La liste suivante énumère toutes ces zones, le long de avec les numéros de section des normes ISO/CEI 9899: 1990 et ISO/CEI 9899: 1999. Certaines zones ne sont définies que par l'implémentation dans une version de la norme.
Certains choix dépendent de l'ABI déterminé de l'extérieur pour la plate-forme (y compris les codages de caractères standard) que GCC suit; ce sont énumérés comme "déterminé par ABI" ci-dessous. * Note Compatibilité binaire: Compatibilité , et `http://gcc.gnu.org/readings.html '. Certains choix sont documentés dans le manuel du préprocesseur. * Remarque Comportement défini par l'implémentation: (cpp) Comportement défini par l'implémentation. Certains choix sont faits par la bibliothèque et le système d'exploitation (ou autre environnement lors de la compilation pour un environnement autonome); se référer à leur documentation pour plus de détails.
Menu:
mise en œuvre de traduction ::
- mise en œuvre Environnement ::
- Identifiers mise en œuvre ::
- :: Characters mise en œuvre
- Entiers mise en œuvre ::
- Mise en oeuvre de virgule flottante ::
- Les tableaux et les pointeurs ::
mise en œuvre- Conseils :: mise en œuvre
- Structures syndicats énumérations et champs de bits mise en œuvre ::
- mise en œuvre Qualifiers ::
- déclarateurs mise en œuvre ::
- mise en œuvre des Déclarations ::
- Mise en oeuvre de directives de prétraitement ::
- Mise en oeuvre de fonctions de bibliothèque ::
- mise en œuvre de l'Architecture ::
- comportement spécifique mise en œuvre :: Locale
double possible de [opération Modulo avec des chiffres négatifs] (http://stackoverflow.com/questions/11720656/modulo-operation-with -négatif-nombres) –