Ist das Kompliment ein reales Problem oder nur ein historisches?

Lesezeit: 7 Minuten

Eine weitere Frage zur Bestimmung von Ungerade/Gerade in C wurde gestellt, und der idiomatische (x & 1)-Ansatz wurde korrekterweise als gebrochen gekennzeichnet Komplement-basiert Systeme, die der C-Standard zulässt.

Existieren Systeme außerhalb von Computermuseen wirklich in der „realen Welt“? Ich programmiere seit den 1970er Jahren und bin mir ziemlich sicher, dass ich noch nie so ein Biest getroffen habe.

Entwickelt oder testet jemand tatsächlich Code für ein solches System? Und wenn nicht, sollten wir uns über solche Dinge Sorgen machen oder sollten wir sie hineinstecken Zimmer 101 zusammen mit Klebeband und Lochkarten …?

  • Ich weiß, diese Frage ist alt, aber jeder, der sie liest, sollte sich dessen bewusst sein (x & 1U) ist gültig (beachten Sie die U) zum Bestimmen der Geraden/Ungerade auch bei Einerkomplement- oder Vorzeichen/Größen-Implementierungen.

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

    15. Oktober 2010 um 5:26 Uhr

  • @R. Sind Sie sicher?: In der 32-Bit-1-Komposition wird -1 als 0xFFFFFFFE dargestellt, also (0xFFFFFFFE & 0x00000001) = 0x00000000 = falsch.

    – Roddy

    15. Oktober 2010 um 9:21 Uhr

  • @Roddy: Das Casting einer negativen vorzeichenbehafteten Ganzzahl ist erforderlich, um (MAX_INT+1- (-value)) auf allen Systemen zu berechnen. Bei Systemen, die Zweierkomplement-Mathematik verwenden, hat das Ergebnis der Berechnung die gleiche Bitdarstellung wie die ursprüngliche vorzeichenbehaftete Ganzzahl, und viele Compiler interpretieren daher einfach den Wert neu, ohne Code zu generieren, um damit zu arbeiten. Auf Systemen mit Einerkomplement- oder Vorzeichenbetragsberechnung müsste der Compiler jedoch Code für die Typumwandlung generieren, um ein definiertes Verhalten sicherzustellen.

    – Superkatze

    13. Oktober 2011 um 17:40 Uhr

  • @Supercat – Interessant, danke! re: (MAX_INT+1- (-value)) – hast du eine Quelle dafür? Ist es nur im C99-Standard?

    – Roddy

    13. Oktober 2011 um 21:20 Uhr

  • Wikipedia-Artikel über signierte Zahlendarstellungen erwähnt, dass “die Mainframes der Unisys ClearPath Dorado-Serie das Einerkomplement verwenden”.

    – Paul A. Clayton

    8. September 2014 um 21:41 Uhr

Ich arbeite im Bereich Telemetrie und wir haben einige unserer Kunden, die alte Analog-Digital-Wandler haben, die immer noch das 1er-Komplement verwenden. Ich musste neulich nur Code schreiben, um das 1er-Komplement in das 2er-Komplement umzuwandeln, um dies zu kompensieren.

Also ja, es ist immer noch da draußen (aber Sie werden nicht sehr oft darauf stoßen).

  • Vorzeichenbehaftete Größe, Offset-Binär und Einerkomplement existieren für I/O, werden aber in der Praxis fast immer per Code entweder in Offset-Binär oder Zweierkomplement umgewandelt, sobald sie eingelesen werden.

    – Superkatze

    13. Oktober 2011 um 17:55 Uhr

  • Könnte jemand mit der entsprechenden Erfahrung bitte einige Markennamen, URLs oder Suchbegriffe angeben, die zur Beantwortung der Frage des OP beitragen könnten? Diese Antwort hilft dabei, meine Suchschlüsselwörter von “Modern Ones’ Complement Platform” in “Modern Ones’ Complement A2D Converter” zu ändern, aber ich bin sicher, dass es möglich ist, expliziter zu sein.

    – Quuxplusone

    15. Januar 2018 um 19:04 Uhr


  • Habe ich Recht, dass diese Antwort nicht von einer C/C++-Plattform spricht, auf der int verwendet nativ die Einerkomplement-Darstellung im Gedächtnis, spricht aber lediglich von a Drahtformat (um mit einem Peripheriegerät zu sprechen), das angibt, dass negative Zahlen in einigen / allen Feldern im Einerkomplement codiert werden müssen? Wenn dies der Fall ist, ähnelt dies dem obigen RFC 791-Beispiel.

    – Quuxplusone

    15. Januar 2018 um 19:07 Uhr

  • @Quuxplusone Ich denke, das unterscheidet sich vom RFC 971-Beispiel. Die 1er-Komplementzahl von einem ADC würde ein digitalisiertes bipolares (positives und negatives) Signal darstellen. Dieser ADC könnte dann direkt als Eingabe in eine 1er-Komplement-Maschine verwendet werden, die wiederum in C/C++ verarbeitet werden könnte; aber solche Beispiele sind mir nicht bekannt. Es wird erwähnt, dass große Anbieter wie Analog Devices diese Art von ADCs einst hergestellt haben, aber selbst ihre Referenzmaterialien deuten darauf hin, dass diese selten sind (vgl. analog.com/media/en/training-seminars/design-handbooks/…)

    – christphrchvz

    26. Juni 2018 um 0:42 Uhr

  • …Ein solcher ADC wäre wahrscheinlich auch alt genug, dass er keinerlei Paket- oder serielle Kommunikationsschnittstelle verwenden würde; stattdessen würden die Bits der digitalisierten Abtastung auf Pins des IC (“parallel”) erscheinen.

    – christphrchvz

    26. Juni 2018 um 0:42 Uhr

Benutzer-Avatar
Adam Haile

Das alles läuft darauf hinaus, seine Wurzeln zu kennen.
Ja, das ist technisch gesehen eine alte Technik, und ich würde wahrscheinlich tun, was andere Leute in dieser Frage vorgeschlagen haben, und den Modulo-Operator (%) verwenden, um ungerade oder gerade Zahlen zu bestimmen. Aber zu verstehen, was ein 1er-Komplement (oder 2er-Komplement) ist, ist immer gut zu wissen. Unabhängig davon, ob Sie sie jemals verwenden oder nicht, Ihre CPU befasst sich die ganze Zeit mit diesen Dingen. Es kann also nie schaden, das Konzept zu verstehen. Moderne Systeme machen es jetzt so, dass Sie sich im Allgemeinen nie um solche Dinge kümmern müssen, so dass es in gewisser Weise zu einem Thema für Programmieren 101-Kurse geworden ist. Aber Sie müssen bedenken, dass einige Leute dies tatsächlich immer noch in der “realen Welt” verwenden würden … zum Beispiel gibt es entgegen der landläufigen Meinung Leute, die weiterhin Montage verwenden! Nicht viele, aber bis CPUs rohes C# und Java verstehen können, jemand wird dieses Zeug noch verstehen müssen.

Und zum Teufel, man weiß nie, wann man etwas findet, bei dem man eigentlich binäre Mathematik durchführen muss, und das 1er-Komplement könnte sich als nützlich erweisen.

  • Vielen Dank. Stimmen Sie voll und ganz zu, dass Sie es gelernt haben müssen, aber Sie sollten sich keine Sorgen darüber machen – wie 6-Bit-Bytes und wie der Kernspeicher funktioniert. Übrigens, es ist “Kompliment”, nicht “Kompliment”. Ein Kompliment könnte lauten: „Das ist ein nettes Zeichenstück, das du heute trägst“.

    – Roddy

    2. Oktober 2008 um 13:36 Uhr

  • Ich mache viele Interviews mit Softwareentwicklern, indem ich Steve Yegges Five Areas (steve.yegge.googlepages.com/…), und Sie glauben besser, dass einer der Bereiche Bits und Bytes ist. Wenn Sie ein guter SDE sein wollen, müssen Sie binäre Zahlensysteme verstehen, und das Einer- und Zweierkomplement ist ein Teil davon. Ich würde hoffen, dass jeder anständige Informatikkurs dies in der/den Computerorganisationsklasse(n) abdeckt.

    – Josh Glover

    26. Dezember 2009 um 6:45 Uhr

  • @Roddy: 6-Bit-Bytes sind in C oder C++ eigentlich nicht erlaubt: die Mindestanzahl von Bits in einem Byte (die C / C++ als sizeof(char)) ist 8.

    – David Stein

    25. Oktober 2013 um 17:43 Uhr

  • @DavidStone eigentlich sizeof(char) definiert ist 1. Worauf Sie sich beziehen möchten, ist CHAR_BIT stattdessen.

    – Ruslan

    21. Juli 2017 um 9:14 Uhr

  • @Ruslan: Entschuldigung, was ich geschrieben habe, war mehrdeutig. Ich habe versucht zu sagen, dass C und C++ ein Byte als definieren sizeof(char)und die Mindestanzahl von Bits darin ist 8.

    – David Stein

    21. Juli 2017 um 13:01 Uhr

Die CDC Cyber ​​18, die ich in den 80er Jahren benutzte, war eine 1s-Komplement-Maschine, aber das ist fast 30 Jahre her, und ich habe seitdem keine mehr gesehen (jedoch war das auch das letzte Mal, dass ich an einem Nicht-PC gearbeitet habe).

RFC 791 p.14 definiert die IP-Header-Prüfsumme wie folgt:

Das Prüfsummenfeld ist das 16-Bit-Einserkomplement der Einerkomplementsumme aller 16-Bit-Wörter im Kopf. Zum Zwecke der Berechnung der Prüfsumme ist der Wert des Prüfsummenfeldes Null.

Das Komplement ist also still schwer in der realen Welt verwendet, in jedem einzelnen IP-Paket, das gesendet wird. 🙂

Ich bin noch nie einem Einserkomplementsystem begegnet, und ich codiere schon so lange wie Sie.

Aber ich bin auf ein 9er-Komplementsystem gestoßen – die Maschinensprache eines HP-41c-Taschenrechners. Ich gebe zu, dass dies als veraltet angesehen werden kann, und ich glaube nicht, dass sie jemals einen C-Compiler dafür hatten.

Ich beschloss, einen zu finden. Die Unisys ClearPath-Systeme haben eine ANSI C-Compiler (ja, sie nennen ihn “American National Standard C”, für den sogar die PDF-Dokumentation zuletzt im Jahr 2013 aktualisiert wurde. Die Dokumentation ist verfügbar online;

Dort verwenden alle vorzeichenbehafteten Typen die Komplementdarstellung mit den folgenden Eigenschaften:

Type                 | Bits | Range
---------------------+------+-----------------
signed char          |   9  |  -2⁸+1 ...  2⁸-1
signed short         |  18  | -2¹⁷+1 ... 2¹⁷-1
signed int           |  36  | -2³⁵+1 ... 2³⁵-1
signed long int      |  36  | -2³⁵+1 ... 2³⁵-1
signed long long int |  72  | -2⁷¹+1 ... 2⁷¹-1

Bemerkenswerterweise unterstützt es auch standardmäßig Non-Conforming unsigned int und unsigned longdie von reichen 0 ... 2³⁶ - 2kann aber in geändert werden 0 ... 2³⁶ - 1 mit Pragma.

Wir sind aus unseren letzten 1960ern herausgekommen Honigboxen irgendwann im letzten Jahr, was es zu unserer ältesten Maschine vor Ort machte. Es war das Zweierkomplement. Das soll nicht heißen, dass es eine schlechte Sache ist, das eigene Komplement zu kennen oder sich dessen bewusst zu sein. Nur, Sie werden heute wahrscheinlich nie auf Komplementprobleme stoßen, egal wie viel Computerarchäologie Sie bei der Arbeit machen.

Die Probleme, auf die Sie eher auf der Integer-Seite stoßen, sind endian Probleme (Ich sehe dich an PDP). Außerdem werden Sie auf mehr Probleme in der “realen Welt” (dh heute) stoßen schwebend Punkt Formate als Sie ganzzahlige Formate.

  • Ich war vor ein paar Wochen auf einer Seite, auf der noch ein paar Honeyboxen liefen! Ich war ziemlich schockiert, als ich sah, dass die Maschine hochgefahren war.

    – McPherrinM

    26. Dezember 2009 um 6:52 Uhr

1383550cookie-checkIst das Kompliment ein reales Problem oder nur ein historisches?

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

Privacy policy