Opérateur C ++% de garanties

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.

5.6 Opérateurs multiplicatifs

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. 🙁