¿Por qué C ++ genera números negativos cuando se usa el módulo?

Mates:

Si tienes una ecuación como esta:

x = 3 mod 7

x podría ser ... -4, 3, 10, 17, ..., o más generalmente:

x = 3 + k * 7

donde k puede ser cualquier entero. No sé si una operación de módulo está definida para las matemáticas, pero el factor de sonido ciertamente lo es.

Pitón:

En Python, siempre obtendrás valores no negativos cuando uses% con un positivom:

#!/usr/bin/python
# -*- coding: utf-8 -*-

m = 7

for i in xrange(-8, 10 + 1):
    print(i % 7)

Resultados en:

6    0    1    2    3    4    5    6    0    1    2    3    4    5    6    0    1    2    3

C ++:

#include <iostream>

using namespace std;

int main(){
    int m = 7;

    for(int i=-8; i <= 10; i++) {
        cout << (i % m) << endl;
    }

    return 0;
}

Saldrá:

-1    0    -6    -5    -4    -3    -2    -1    0    1    2    3    4    5    6    0    1    2    3    

ISO / IEC 14882: 2003 (E) - 5.6 Operadores multiplicativos:

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; 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 74).

y

74) Según el trabajo en curso hacia la revisión de ISO C, el algoritmo preferido para la división de enteros sigue las reglas definidas en la norma ISO Fortran, ISO / IEC 1539: 1991, en la que el cociente siempre se redondea hacia cero.

Fuente:ISO / IEC 14882: 2003 (E)

(No pude encontrar una versión gratuita deISO/IEC 1539:1991. ¿Alguien sabe de dónde obtenerlo?

La operación parece definirse así:

Pregunta:

¿Tiene sentido definirlo así?

¿Cuáles son los argumentos para esta especificación? ¿Hay un lugar donde las personas que crean tales estándares discutan sobre esto? ¿Dónde puedo leer algo sobre las razones por las que decidieron hacerlo de esta manera?

La mayoría de las veces, cuando uso el módulo, quiero acceder a elementos de una estructura de datos. En este caso, debo asegurarme de que el mod devuelva un valor no negativo. Entonces, para este caso, sería bueno que el mod siempre devolviera un valor no negativo. (Otro uso es elAlgoritmo euclidiano. Como puede hacer que ambos números sean positivos antes de usar este algoritmo, el signo de módulo sería importante.)

Material adicional:

VerWikipedia para una larga lista de lo que el módulo hace en diferentes idiomas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta