Entier de la division de l'arrondissement avec les négatifs en C++
Supposons que a
et b
sont tous deux de type int
, et b
est différente de zéro. Considérons la suite de l'exécution de a/b
dans les cas suivants:
a
etb
sont tous les deux positifs.a
etb
sont tous les deux négatifs.- Exactement l'un d'eux est négatif.
Dans le Cas 1, le résultat est arrondi à l'entier le plus proche. Mais quelle est la norme de dire à propos de Cas 2 et 3? Un vieux projet que j'ai trouvé flottant sur l'Internet indique qu'il est dépendant de l'implémentation (oui, même les cas 2), mais le comité s'est penché vers le rendant toujours " tour vers zéro." Personne ne sait ce que la (dernière) standard dit? Merci de répondre uniquement basé sur la norme, pas ce qui fait sens, ou de ce particulier les compilateurs n'.
- Incroyable possibilité de recherche compte tenu de la 1200 page de la nature de la norme. Je vais lui donner un coup de grep et d'abandonner 🙂
Vous devez vous connecter pour publier un commentaire.
Selon Mai 2008 sur la révision,
Vous avez raison:
Note 75 dit:
Les Chances sont que C++ gal C à cet égard. Comme il est, il est indéfini, mais ils ont un oeil vers le changer.
Je travail dans le même ministère que Stroustrup, et avec un membre du comité. Les choses prennent une éternité pour obtenir accompli, et son infini politique. Si il semble idiot, il l'est probablement.
Comme une mise à jour pour les autres réponses:
La dernière version de C++11, n3242 qui est à toutes fins pratiques identiques à la réalité de C++11, dit ce de 5,6 point 4 (page 118):
Note de 80 membres (à noter que les notes sont non-normatif):
Point 4 stipule:
qui peut être montré pour exiger le signe de
a%b
être le même que le signe dea
(lorsqu'il n'est pas zéro).Juste un commentaire. L'actuel projet de travail pour le C++ standard, en effet, corrige la "mise en œuvre définies par l'" de l'émission et de la demande pour la troncature vers zéro. Ici est la page web du comité, et ici est le projet. La question est à la page 112.
Parfois, nous avons besoin de prendre un peu de recul et regardez juste les mathématiques de l'informatique:
Donné int x, int y
si int i1 = x/y et
int i2 = x%y
alors y * i1 + i2 doit être x
Donc ce n'est pas tellement au sujet de la norme, mais il n'y a qu'une seule façon cela peut peut-être. Si des normes permet de toute autre façon, la norme est mal, et cela signifie que la langue est cassé.