Creo que es más útil pensar mod
que se define en aritmética abstracta; no como una operación, sino como una clase de aritmética completamente diferente, con diferentes elementos y diferentes operadores. Eso significa que la suma mod 3
no es lo mismo que la suma "normal"; es decir; suma entera.
Entonces cuando lo haces:
5 % -3
Está intentando asignar el número entero 5 a un elemento en el conjunto de mod -3
. Estos son los elementos de mod -3
:
{ 0, -2, -1 }
Entonces:
0 => 0, 1 => -2, 2 => -1, 3 => 0, 4 => -2, 5 => -1
Digamos que tiene que permanecer despierto por alguna razón 30 horas, ¿cuántas horas le quedan de ese día? 30 mod -24
.
Pero lo que C implementa no es mod
, es un resto. De todos modos, el punto es que tiene sentido devolver negativos.