Integer Division Rundung mit Negativen in C ++
Angenommen a
und b
sind beide vom Typ int
und b
ungleich null ist. Betrachten Sie das Ergebnis der Durchführung a/b
in den folgenden Fällen:
a
undb
sind beide nicht negative.a
undb
sind beide negativ.- Genau eine von Ihnen negativ ist.
In Fall 1 das Ergebnis gerundet auf die nächste Ganzzahl. Aber was macht der standard-sagen über die Fälle 2 und 3? Einen alten Entwurf fand ich schwimmend im Internet zeigt, dass es ist von der Implementierung abhängig (ja, auch Fall 2) der Ausschuss ist jedoch der Neigung zu machen ist es immer " Runde gegen null.' Weiß jemand, was die (aktuellen) standard sagt? Bitte beantworten Sie nur die auf dem standard basieren, nicht was Sinn macht oder was bestimmte Compiler tun.
InformationsquelleAutor der Frage | 2008-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut der im Mai 2008 revision,
Du hast Recht:
Hinweis zu 75, sagt:
Sind die Chancen, dass C++ wird C lag in dieser Hinsicht. So wie es da steht, ist es undefiniert, aber Sie haben ein Auge Richtung zu ändern.
Ich arbeiten in der gleichen Abteilung wie Stroustrup und mit einem Mitglied des Ausschusses. Die Dinge nehmen ALTER zu erhalten, erreicht, und Ihren endlos politischen. Wenn es scheint dumm, es ist wahrscheinlich.
InformationsquelleAutor der Antwort Stefan Mai
Als update zu den anderen Antworten:
Den letzten Entwurf von C++11, n3242die für die meisten praktischen Zwecke identisch mit der tatsächlichen C++ - 11-standard, der dies sagt, in 5.6 Punkt 4 (Seite 118):
Hinweis 80 Staaten (beachten Sie, dass die notes sind nicht-normative):
Punkt 4 geht es weiter:
denen gezeigt werden kann, erfordern die Zeichen der
a%b
die gleiche wie die Zeichen dera
(wenn nicht null).InformationsquelleAutor der Antwort Sjoerd
Einfach einen Kommentar. Der aktuelle Arbeitsentwurf für die C++ standard in der Tat korrigiert die "implementation-defined" - Problem auf und fragt nach abschneiden in Richtung null. Hier der Ausschuß ist der Webseite, und hier ist der Entwurf. Das Problem ist auf Seite 112.
InformationsquelleAutor der Antwort Federico A. Ramponi
Manchmal müssen wir einen Schritt zurück, und sehen Sie nur die Mathematik:
Gegeben int x, int y
wenn int i1 = x/y und
int i2 = x%y
dann y * i1 + i2 muss x
Also das ist nicht so viel über den standard, aber es gibt nur einen Weg, dies möglich zu machen. Wenn alle standards kann es anders sein, dann ist die Norm falsch ist, und das bedeutet, dass die Sprache unterbrochen ist.
InformationsquelleAutor der Antwort user3283405