Dlaczego C ++ generuje liczby ujemne podczas używania modulo?

Matematyka:

Jeśli masz takie równanie:

x = 3 mod 7

x może być ... -4, 3, 10, 17, ... lub bardziej ogólnie:

x = 3 + k * 7

gdzie k może być dowolną liczbą całkowitą. Nie znam operacji modulo zdefiniowanej dla matematyki, ale pierścień czynników jest z pewnością.

Pyton:

W Pythonie zawsze używasz wartości nieujemnych% z pozytywemm:

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

m = 7

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

Prowadzi do:

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

Wyjdzie:

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

Operator binary / daje iloraz, a operator binary% daje resztę z podziału pierwszego wyrażenia przez drugie. Jeśli drugi operand / lub% ma wartość zero, zachowanie jest niezdefiniowane; w przeciwnym razie (a / b) * b + a% b jest równe a. Jeśli oba operandy są nieujemne, to reszta jest nieujemna; Jeśli nie,znak pozostałej części jest zdefiniowany przez implementację 74).

i

74) Zgodnie z trwającymi pracami nad rewizją ISO C, preferowany algorytm dla podziału całkowitego jest zgodny z zasadami określonymi w normie ISO Fortran, ISO / IEC 1539: 1991, w której iloraz jest zawsze zaokrąglany do zera.

Źródło:ISO / IEC 14882: 2003 (E)

(Nie mogłem znaleźć darmowej wersjiISO/IEC 1539:1991. Czy ktoś wie, skąd go wziąć?)

Operacja wydaje się być zdefiniowana w ten sposób:

Pytanie:

Czy to ma sens zdefiniować to w ten sposób?

Jakie są argumenty dla tej specyfikacji? Czy jest miejsce, gdzie ludzie, którzy tworzą takie standardy, omawiają to? Gdzie mogę przeczytać coś o powodach, dla których zdecydowali się zrobić to w ten sposób?

Przez większość czasu, gdy używam modulo, chcę uzyskać dostęp do elementów struktury danych. W tym przypadku muszę się upewnić, że mod zwraca nieujemną wartość. W tym przypadku dobrze byłoby, gdyby mod zawsze zwracał wartość nieujemną. (Innym zastosowaniem jestAlgorytm euklidesowy. Ponieważ możesz użyć obu liczb dodatnich przed użyciem tego algorytmu, znak modulo miałby znaczenie.)

Dodatkowy materiał:

WidziećWikipedia po długą listę tego, co modulo robi w różnych językach.

questionAnswers(3)

yourAnswerToTheQuestion