Gibt es Implementierungen von C, die keine Zweierkomplemente sind?

Lesezeit: 4 Minuten

Benutzeravatar von paxdiablo
paxdiablo

Wie wir alle zweifellos wissen, erlaubt der ISO-C-Standard (und auch C++, denke ich, obwohl ich mich mehr für die C-Seite interessiere) drei zugrunde liegende Darstellungen von vorzeichenbehafteten Zahlen:

  • Zweierkomplement;
  • Einerkomplement; und
  • Vorzeichen/Betrag.

Der Wikipedia-Eintrag besagt, dass Vorzeichen / Größe auf dem IBM 7090 aus den 60er Jahren verwendet werden und dass das Einerkomplement von PDP-1, CDC 160A und UNIVAC 1100 verwendet wird, die alle ebenfalls aus den 60er Jahren stammen.

Gibt es andere Implementierungen von C (oder der zugrunde liegenden Hardware) mit diesen alternativen Darstellungen, die vor etwas mehr als fünfzig Jahren herausgekommen sind (und welche)?

Es scheint ein wenig verschwenderisch, etwas in einem Standard für Maschinen zu behalten, die es nicht mehr gibt.

  • Gilt “Ja, jemand kennt Nicht-Zweierkomplement-Implementierungen” als Antwort? 🙂

    – Kerrek SB

    5. September 2012 um 8:11 Uhr


  • @KerrekSB: Nur wenn Sie das mit Beweisen belegen können … 🙂

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    5. September 2012 um 8:11 Uhr

  • @KerrekSB: Die Frage wurde mit “und was sind sie” aktualisiert, um den Punkt strittig zu machen 🙂

    – paxdiablo

    5. September 2012 um 8:13 Uhr

  • Beachten Sie, dass das Entfernen von Nicht-2er-Komplementen aus dem Standard meine Standardreaktion auf alle “Was halten Sie von dieser etwas verwirrenden Extravaganz?” Fragen, die schnell bestätigen sollen, dass sie nicht für negative Zahlen im 1er-Komplement funktionieren. Als solches bin ich entweder entschieden dagegen oder entschieden dafür, aber ich bin mir nicht sicher, was.

    – Steve Jessop

    5. September 2012 um 8:31 Uhr


  • Siehe Exotische Architekturen, um die sich das Standardkomitee kümmert

    – Bo Persson

    5. September 2012 um 9:10 Uhr

Benutzeravatar von Mike Seymour
Mike Seymour

Das neueste Beispiel, das ich finden kann, ist die UNISYS2200 Reihe, basierend auf UNIVAC, mit Einerkomplement-Arithmetik. Die verschiedenen Modelle wurden zwischen 1986 und 1997 hergestellt, aber das Betriebssystem befand sich noch in der aktiven Entwicklung noch 2015. Sie hatten auch einen C-Compiler, wie man sieht hier.

Es ist wahrscheinlich, dass sie noch heute verwendet werden.

  • Aus Interesse, was waren Unisys 2200 zum? Ersetzen Sie abgenutzte Univacs, auf denen geschäftskritische Legacy-Apps ausgeführt werden, oder gibt es neue Entwicklungen?

    – Steve Jessop

    5. September 2012 um 9:13 Uhr


  • Unisys angeboten Hardware mit OS2200 erst im letzten Jahr (2011).

    – Bo Persson

    5. September 2012 um 9:14 Uhr

  • Laut Wikipedia ist die neueste Version von Betriebssystem 2200 ist von 2010.

    – Fred Foo

    5. September 2012 um 10:00 Uhr

  • Der C-Compiler des OS 2200 scheint in seinem “Einerkomplementmodus” nicht standardkonform zu sein. Der maximale vorzeichenlose Wert (UINT_MAX) ist 2^N-2nicht 2^N-1. Es sieht so aus, als ob dies so gemacht wird, dass 0x3FFFF oder minus Null kein gültiger Wert ist, wenn Sie ein vorzeichenbehaftetes in ein vorzeichenloses Int umwandeln, ohne das Bitmuster zu ändern. (Das heißt, C99 und C11 kann mit C89 kompatibel sein, aber nur in einem es gibt kein Gesetz dagegen Weise ist es ziemlich offensichtlich, was ein unsigned erwartet wird. )

    – Benutzer3710044

    18. April 2015 um 15:57 Uhr


  • Selbst wenn der Compiler 2015 aktualisiert wurde, scheint er mit keinem Standard nach C89 kompatibel zu sein; unter anderem hat es keinen vorzeichenlosen Typ, der länger als 36 Bit ist.

    – Superkatze

    10. November 2016 um 19:40 Uhr

Ich habe keine schlüssigen Beweise dafür, dass es keine gibt, aber ich habe noch nie einen gesehen. Meines Wissens war alle Nicht-Zweierkomplement-Hardware veraltet, lange bevor C standardisiert wurde.

Der vielleicht beste Weg, um Beweise zu sammeln, wäre, nach widersprüchlichen Anforderungen und anderen offensichtlichen Fehlern im Standard zu suchen, die mit Nicht-Zweierkomplement-Systemen verbunden sind. Wenn noch nie eine solche Implementierung erstellt wurde, ist es wahrscheinlich, dass es Versäumnisse in der Spezifikation gibt, die offensichtlich werden, wenn jemand tatsächlich versucht, eine zu erstellen.

  • Oder um dies gründlich zu tun: Schreiben Sie eine VM mit minimalem Bytecode, die das 1er-Komplement und / oder die Vorzeichengröße verwendet. Implementieren Sie ein GCC- oder LLVM-Backend dafür, wenn einer von ihnen nominale Unterstützung dafür hat, oder eine vollständige C-Implementierung, wenn dies nicht der Fall ist. Das beantwortet sowohl die Frage (“Ja, ich kenne jetzt eine Nicht-2er-Komplement-Implementierung”) als auch die Möglichkeit, überlegte Fehlerberichte einzureichen, wenn der Standard Versäumnisse aufweist. Wenn einer der Fehler kritisch ist, dann ist es Munition, das 2er-Komplement im nächsten Standard vorzuschreiben.

    – Steve Jessop

    5. September 2012 um 8:15 Uhr


  • @SteveJessop: Das ist ein cooler Ansatz, aber es könnte etwas mehr Arbeit sein, als normalerweise in die Beantwortung einer SO-Frage gesteckt wird 😉

    – Joachim Sauer

    5. September 2012 um 8:17 Uhr

  • @JoachimSauer: Ich gebe zu, dass mich das persönlich nicht stören kann.

    – Steve Jessop

    5. September 2012 um 8:17 Uhr

  • @ams: Mein Ziel hat kein Betriebssystem, es ist nur ein Spielzeug-Bytecode-Interpreter. Aber wenn GCC das 2er-Komplement annimmt, dann ist es sicher nicht gut für mein hypothetisches Projekt.

    – Steve Jessop

    5. September 2012 um 9:11 Uhr

  • Ich würde vermuten, dass GCC zumindest sowohl Zweierkomplement als auch 8-Bit-Bytes annimmt. Nun, anstatt “anzunehmen”, würde ich einfach “definiert” sagen, da es Sache des Compilers ist, diese Konzepte zu definieren. Sogar auf einer Maschine, die Vorzeichen/Mag oder Einerkomplement ausführen sollte, kann der Compiler einfach eine Zweierkomplementumgebung bereitstellen, indem er einfach die vorzeichenlosen arithmetischen Anweisungen anstelle der vorzeichenbehafteten verwendet …

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    5. September 2012 um 14:44 Uhr


1408240cookie-checkGibt es Implementierungen von C, die keine Zweierkomplemente sind?

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

Privacy policy