Est-il garanti que (-x) % m
, où x
et m
sont positifs dans c ++ standard (c ++ 0x) est négatif et égal à -(x % m)
?
Je sais que c’est juste sur toutes les machines que je connais.
Outre la réponse de Luchian , voici la partie correspondante de la norme C ++ 11:
L’opérateur binary / donne le quotient et l’opérateur% binary donne le rest de la division de la première expression par la seconde. Si le deuxième opérande de / ou% est zéro, le comportement est indéfini. Pour les opérandes intégraux, l’opérateur / fournit le quotient algébrique avec toute partie fractionnaire rejetée; si le quotient a / b est représentable dans le type du résultat, (a / b) * b + a% b est égal à a.
Ce qui manque la dernière phrase. Donc la partie
(a / b) * b + a% b est égal à a
C’est la seule référence sur laquelle s’appuyer, et cela implique que a % b
aura toujours le signe de a
, étant donné le comportement tronquant de /
. Donc, si votre implémentation respecte la norme C ++ 11 à cet égard, le signe et la valeur d’une opération modulo sont en effet parfaitement définis pour les opérandes négatifs.
4) L’opérateur / binary donne le quotient et l’opérateur% binary donne le rest de la division de la première expression par la seconde. Si le deuxième opérande de / ou% est zéro, le comportement est indéfini; sinon (a / b) * b + a% b est égal à a. Si les deux opérandes sont non négatifs, le rest est non négatif. sinon, le signe du rest est défini par la mise en oeuvre (c’est moi qui souligne)
Ceci est du C ++ 03 cependant. 🙁