Por que o C ++ gera números negativos ao usar o modulo?

Matemática:

Se você tem uma equação como esta:

x = 3 mod 7

x poderia ser ... -4, 3, 10, 17, ... ou mais geralmente:

x = 3 + k * 7

onde k pode ser qualquer inteiro. Eu não sei de uma operação de módulo é definida para matemática, mas o anel de fator certamente é.

Python:

Em Python, você sempre obterá valores não negativos quando usar% com um positivom:

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

m = 7

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

Resulta em:

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;
}

Saída:

-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:

O operador binário gera o quociente e o operador% binário produz o resto da divisão da primeira expressão pelo segundo. Se o segundo operando de / ou% for zero, o comportamento é indefinido; caso contrário (a / b) * b + a% b é igual a a. Se ambos os operandos são não-negativos, o restante é não-negativo; se não,o sinal do restante é definido pela implementação 74).

e

74) De acordo com o trabalho em andamento para a revisão da ISO C, o algoritmo preferido para divisão inteira segue as regras definidas no padrão ISO Fortran, ISO / IEC 1539: 1991, em que o quociente é sempre arredondado para zero.

Fonte:ISO / IEC 14882: 2003 (E)

(Eu não consegui encontrar uma versão gratuita doISO/IEC 1539:1991. Alguém sabe onde obtê-lo?

A operação parece ser definida assim:

Questão:

Faz sentido definir isso assim?

Quais são os argumentos para essa especificação? Existe um lugar onde as pessoas que criam tais padrões discutem sobre isso? Onde eu posso ler algo sobre as razões pelas quais eles decidiram fazer isso dessa maneira?

Na maior parte do tempo, quando uso modulo, quero acessar elementos de uma estrutura de dados. Nesse caso, tenho que ter certeza de que o mod retorna um valor não negativo. Então, para este caso, seria bom que mod sempre retornasse um valor não negativo. (Outro uso é oAlgoritmo Euclidiano. Como você poderia tornar ambos os números positivos antes de usar este algoritmo, o sinal do módulo importaria.)

Material adicional:

VejoWikipedia para uma longa lista do que o módulo faz em diferentes idiomas.

questionAnswers(3)

yourAnswerToTheQuestion