sencillos - C++ operador% garantías
prioridad de operadores en c (2)
5.6 Operadores multiplicativos.
4) El operador binario produce el cociente y el operador binario% produce el resto de la división de la primera expresión por la segunda. Si el segundo operando de / o% es cero, el comportamiento es indefinido; de lo contrario (a / b) * b + a% b es igual a a. Si ambos operandos son no negativos, el resto es no negativo; si no, el signo del resto está definido por la implementación (énfasis mío)
Esto es de C ++ 03 sin embargo. :(
¿Se garantiza que (-x) % m
, donde x
y m
son positivos en el estándar c ++ (c ++ 0x) es negativo e igual a -(x % m)
?
Sé que está justo en todas las máquinas que conozco.
Además de la respuesta de Luchian , esta es la parte correspondiente del estándar C ++ 11:
El operador binario produce el cociente, y el operador binario% produce el resto de la división de la primera expresión por la segunda. Si el segundo operando de / o% es cero, el comportamiento no está definido. Para los operandos integrales, el operador / produce el cociente algebraico con cualquier parte fraccionaria descartada; si el cociente a / b es representable en el tipo del resultado, (a / b) * b + a% b es igual a a.
Que pierde la última frase. Entonces la parte
(a / b) * b + a% b es igual a a
Es la única referencia en la que confiar, y eso implica que a % b
siempre tendrá el signo de a
, dado el comportamiento truncador de /
. Entonces, si su implementación se adhiere al estándar C ++ 11 a este respecto, el signo y el valor de una operación de módulo se definen perfectamente para los operandos negativos.