Warum gibt C ++ bei Verwendung von modulo negative Zahlen aus?

Mathematik:

Wenn Sie eine Gleichung wie diese haben:

x = 3 mod 7

x könnte ... -4, 3, 10, 17, ... oder allgemeiner sein:

x = 3 + k * 7

wobei k eine beliebige ganze Zahl sein kann. Ich weiß nicht, dass eine Modulo-Operation für Mathematik definiert ist, aber der Faktor Ring ist es mit Sicherheit.

Python:

In Python erhalten Sie bei der Verwendung immer nicht negative Werte% mit einem positivenm:

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

m = 7

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

Ergebnisse in:

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

Wird ausgeben:

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

ISO / IEC 14882: 2003 (D) - 5.6 Multiplikative Operatoren:

Der binäre Operator liefert den Quotienten und der binäre Operator% den Rest aus der Division des ersten Ausdrucks durch den zweiten. Wenn der zweite Operand von / oder% Null ist, ist das Verhalten undefiniert. ansonsten ist (a / b) * b + a% b gleich a. Wenn beide Operanden nicht negativ sind, ist der Rest nicht negativ. wenn nicht,das Vorzeichen des Restes ist implementierungsdefiniert 74).

und

74) Gemäß den Arbeiten zur Überarbeitung von ISO C folgt der bevorzugte Algorithmus für die Ganzzahldivision den im ISO-Fortran-Standard ISO / IEC 1539: 1991 definierten Regeln, in denen der Quotient immer auf Null gerundet wird.

Quelle:ISO / IEC 14882: 2003 (E)

(Ich konnte keine kostenlose Version von findenISO/IEC 1539:1991. Weiß jemand wo es herkommt?)

Die Operation scheint wie folgt definiert zu sein:

Frage:

Ist es sinnvoll, es so zu definieren?

Was sind Argumente für diese Spezifikation? Gibt es einen Ort, an dem die Leute, die solche Standards erstellen, darüber diskutieren? Wo kann ich etwas über die Gründe lesen, warum sie beschlossen haben, es so zu machen?

Wenn ich modulo verwende, möchte ich meistens auf Elemente einer Datenstruktur zugreifen. In diesem Fall muss ich sicherstellen, dass Mod einen nicht negativen Wert zurückgibt. Also, für diesen Fall wäre es gut, von mod immer einen nicht negativen Wert zurückzugeben. (Eine andere Verwendung ist dieEuklidischer Algorithmus. Da Sie beide Zahlen positiv machen könnten, bevor Sie diesen Algorithmus verwenden, würde das Vorzeichen von modulo eine Rolle spielen.)

Zusätzliches Material:

SehenWikipedia für eine lange Liste dessen, was modulo in verschiedenen Sprachen macht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage