Gibt entweder ANSI C oder ISO C an, was -5 % 10 sein sollte?

Lesezeit: 3 Minuten

Benutzer-Avatar
Chas. Owens

Ich meine mich zu erinnern, dass ANSI C nicht angegeben hat, welcher Wert zurückgegeben werden soll, wenn einer der Operanden eines Modulo-Operators negativ ist (nur dass er konsistent sein sollte). Wurde es später angegeben oder wurde es immer angegeben und ich erinnere mich falsch?

  • mögliches Duplikat der Modulo-Operation mit negativen Zahlen

    – Ciro Santilli Путлер Капут 六四事

    2. Juli 2015 um 11:45 Uhr

Benutzer-Avatar
kennytm

C89, nicht vollständig (§3.3.5/6). Es kann entweder -5 oder 5 sein, da -5 / 10 0 oder -1 zurückgeben kann (% wird in Bezug auf eine lineare Gleichung definiert, die beinhaltet /, * und +):

Wenn bei der Division ganzer Zahlen die Division ungenau ist und beide Operanden positiv sind, ist das Ergebnis der / Operator ist die größte ganze Zahl kleiner als der algebraische Quotient und das Ergebnis von % Betreiber ist positiv. Wenn einer der Operanden negativ istob das Ergebnis der / Operator ist die größte ganze Zahl kleiner als der algebraische Quotient oder die kleinste ganze Zahl größer als der algebraische Quotient implementierungsdefiniertwie das Vorzeichen des Ergebnisses von ist % Operator. Wenn der Quotient a/b darstellbar ist, der Ausdruck (a/b)*b + a%b soll gleich sein a.

C99, ja (§6.5.5/6), das Ergebnis muss -5 sein:

Wenn ganze Zahlen dividiert werden, ist das Ergebnis der / Operator ist der algebraische Quotient, wobei jeder Bruchteil verworfen wird.88) Wenn der Quotient a/b darstellbar ist, der Ausdruck (a/b)*b + a%b soll gleich sein a.

88) Dies wird oft als “Abschneiden in Richtung Null” bezeichnet.


In ähnlicher Weise ist das Ergebnis in C++98 implementierungsdefiniert (§5.6/4), gemäß der Definition von C89, erwähnt jedoch, dass die Rundungsregel gegen Null bevorzugt wird.

… Wenn beide Operanden nichtnegativ sind, dann ist der Rest nichtnegativ; wenn nicht, ist das Vorzeichen des Rests implementierungsdefiniert74).

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

und tatsächlich wird es zur Standardregel in C++0x (§5.6/4):

… Für ganzzahlige Operanden die / Operator liefert den algebraischen Quotienten, wobei alle Nachkommastellen verworfen werden;82

82) Dies wird oft als Abschneiden in Richtung Null bezeichnet.

Um ein kleines Detail zu KennyTMs Antwort hinzuzufügen: Wenn die C-Standards etwas fordern Umsetzung definiert dann ist diese Implementierung erforderlich um die getroffene Wahl zu dokumentieren. Normalerweise steht dies in der Compiler- oder Bibliotheksdokumentation (Manpage, Hilfehandbuch, gedruckte Dokumente, CD-Booklet 🙂 Jede Implementierung, die Konformität mit C89 oder höher beansprucht muss stellen Sie diese irgendwo zur Verfügung. Versuchen Sie, nach einem solchen Dokument zu suchen. Im Falle des gcc das steht zum beispiel in der gcc-info:

4 C Implementierungsdefiniertes Verhalten


Eine konforme Implementierung von ISO C ist erforderlich, um ihre Verhaltenswahl in jedem der Bereiche zu dokumentieren, die als “Implementierung definiert” bezeichnet werden. Im Folgenden sind alle diese Bereiche zusammen mit den Abschnittsnummern der Normen ISO/IEC 9899:1990 und ISO/IEC 9899:1999 aufgeführt. Einige Bereiche sind nur in einer Version des Standards implementierungsdefiniert.

Einige Entscheidungen hängen von der extern festgelegten ABI für die Plattform (einschließlich Standardzeichencodierungen) ab, der GCC folgt; diese sind unten als “bestimmt durch ABI” aufgeführt. *Hinweis zur Binärkompatibilität: Kompatibilität und `http://gcc.gnu.org/readings.html’. Einige Auswahlmöglichkeiten sind im Präprozessorhandbuch dokumentiert. *Hinweis Implementierungsdefiniertes Verhalten: (cpp)Implementierungsdefiniertes Verhalten. Einige Entscheidungen werden von der Bibliothek und dem Betriebssystem (oder einer anderen Umgebung beim Kompilieren für eine freistehende Umgebung) getroffen; Details finden Sie in der Dokumentation.

  • Speisekarte:

  • Umsetzung der Übersetzung::

  • Umgebungsimplementierung::
  • Identifikatoren-Implementierung::
  • Zeichenimplementierung::
  • Implementierung von ganzen Zahlen:
  • Gleitkommaimplementierung::
  • Implementierung von Arrays und Zeigern:
  • Hinweise zur Umsetzung::
  • Strukturen, Unions, Aufzählungen und Bitfelder-Implementierung:
  • Qualifizierungsimplementierung::
  • Deklaratoren-Implementierung::
  • Umsetzung der Anweisungen::
  • Implementierung von Vorverarbeitungsanweisungen:
  • Implementierung von Bibliotheksfunktionen:
  • Architekturimplementierung::
  • Lokalisierungsspezifische Verhaltensimplementierung::

1216030cookie-checkGibt entweder ANSI C oder ISO C an, was -5 % 10 sein sollte?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy