Operador de módulo con valores negativos

Por qué hacer tales operaciones:

std::cout << (-7 % 3) << std::endl; std::cout << (7 % -3) << std::endl; 

dar diferentes resultados?

 -1 1 

De ISO14882: 2011 (e) 5.6-4:

El operador binario produce el cociente, y el operador binario% produce el rest de la división de la primera expresión por el segundo. Si el segundo operando de / o% es cero, el comportamiento no está definido. Para operandos integrales, el operador / produce el cociente algebraico con cualquier parte fraccional descartada; si el cociente a / b es representable en el tipo de resultado, (a / b) * b + a% b es igual a a.

El rest es matemática básica:

 (-7/3) => -2 -2 * 3 => -6 so a%b => -1 (7/-3) => -2 -2 * -3 => 6 so a%b => 1 

Tenga en cuenta que

Si ambos operandos son no negativos, el rest no es negativo; si no, el signo del rest está definido por la implementación.

de ISO14882: 2003 (e) ya no está presente en ISO14882: 2011 (e)

El signo en tales casos (es decir, cuando uno o ambos operandos son negativos) está definido por la implementación. La especificación dice en §5.6 / 4 (C ++ 03),

El operador binario produce el cociente, y el operador binario% produce el rest de la división de la primera expresión por el segundo. Si el segundo operando de / o% es cero, el comportamiento no está definido; de lo contrario (a / b) * b + a% b es igual a a. Si ambos operandos son no negativos, el rest no es negativo; si no, el signo del rest está definido por la implementación .

Eso es todo lo que el lenguaje tiene que decir, en lo que se refiere a C ++ 03.

 a % b 

en c ++ por defecto:

 (-7/3) => -2 -2 * 3 => -6 so a%b => -1 (7/-3) => -2 -2 * -3 => 6 so a%b => 1 

en python:

 -7 % 3 => 2 7 % -3 => -2 

en c ++ a python:

 (b + (a%b)) % b