Zweierkomplement-Rechner (Binärumwandlung vorzeichenbehafteter Ganzzahlen)

Wandelt eine vorzeichenbehaftete Dezimalzahl in ihr 8-/16-/32-/64-Bit-Zweierkomplement-Bitmuster um oder umgekehrt. Zeigt zusätzlich die vorzeichenlose Interpretation, die Hexadezimalschreibweise und erkennt Werte außerhalb des Bereichs.

Tipps

  • Eine vorzeichenbehaftete 8-Bit-Ganzzahl reicht von -128 bis 127. Geben Sie zunächst 127 und dann 128 ein, um die Überlaufgrenze in Aktion zu sehen – 128 passt nicht hinein und löst den Bereichsfehler aus, genau dort, wo der Umschlag zu -128 stattfinden würde.
  • Die Zeile „vorzeichenlose Dezimalzahl“ liest dasselbe Bitmuster, ohne das höchstwertige Bit als Vorzeichen zu behandeln. Der Vergleich mit der vorzeichenbehafteten Zeile macht den Unterschied zwischen beiden Interpretationen sofort sichtbar.
  • Eine Binäreingabe muss genau so viele Stellen haben wie die gewählte Bitbreite – 8 Stellen für 8 Bit, 16 für 16 Bit und so weiter.
  • 64-Bit-Berechnungen verwenden intern BigInt statt des Number-Typs von JavaScript, sodass Werte nahe 2^63 ohne Genauigkeitsverlust umgewandelt werden.
  • Dieses Tool eignet sich auch, um das Überlaufverhalten von Ganzzahlen in Sprachen wie C und Java zu verstehen, wo int (32 Bit) und long (64 Bit) genau an diesen Grenzen umschlagen.

Häufig gestellte Fragen

Sowohl die Vorzeichen-Betrag-Darstellung als auch das Einerkomplement enden mit zwei unterschiedlichen Bitmustern für null („+0“ und „-0“), was Vergleichs- und Rechenschaltungen verkompliziert. Das Zweierkomplement besitzt genau ein Bitmuster für null, und – ebenso wichtig – dieselbe Addierschaltung, die die Addition durchführt, kann auch die Subtraktion übernehmen. Diese beiden Eigenschaften erlauben es CPU-Designern, die arithmetisch-logische Einheit zu vereinfachen, weshalb fast alle modernen Prozessoren intern das Zweierkomplement für vorzeichenbehaftete Ganzzahlen verwenden.

-128 bis 127. Da das höchstwertige Bit für das Vorzeichen reserviert ist, existieren auf der positiven Seite nur 128 unterschiedliche Muster (0 bis 127), während die negative Seite 128 unterschiedliche Werte (-1 bis -128) darstellen kann, da das Zweierkomplement nur ein Bitmuster für null hat und das übrige Muster der negativen Seite zugutekommt – daher der asymmetrische Bereich.

Das Einerkomplement bildet eine negative Zahl, indem einfach jedes Bit des positiven Werts invertiert wird. Das Zweierkomplement geht einen Schritt weiter und addiert nach der Invertierung 1. Dieser zusätzliche Schritt beseitigt das dem Einerkomplement innewohnende „Zwei-Nullen-Problem“ (00000000 für „+0“ und 11111111 für „-0“), weshalb sich das Zweierkomplement als Standard durchgesetzt hat.

Da die Bitbreite fest ist, wird bei jedem Rechenergebnis, das den darstellbaren Bereich überschreitet, das höchstwertige Bit abgeschnitten, wodurch sich die Bedeutung des Vorzeichenbits ändert. Addiert man beispielsweise 1 zum vorzeichenbehafteten 8-Bit-Maximum 127, entsteht das Bitmuster 10000000, das nach vorzeichenbehafteten Regeln als -128 interpretiert wird. Das Überschreiten der Obergrenze führt zu einem Sprung an die Untergrenze – genau dieser kontraintuitive Sprung ist der Überlauf.

Das Bitmuster selbst ändert sich nicht, aber ohne das höchstwertige Bit als Vorzeichen zu behandeln, trägt jedes Bit einfach seinen üblichen Stellenwert bei. So entspricht das 8-Bit-Muster 11111011 bei vorzeichenbehafteter Lesart -5, bei vorzeichenloser Lesart jedoch 251. Genau diese Neuinterpretation geschieht in der Praxis immer dann, wenn Sie einen „vorzeichenlosen“ Typ wie unsigned int in C auf einen zuvor vorzeichenbehandelten Wert anwenden.
ツールくん

Übrigens – Warum Computer das Zweierkomplement verwenden

Das Zweierkomplement ist nicht die einzige Möglichkeit, negative Zahlen binär darzustellen. Historisch wurden auch die Vorzeichen-Betrag-Darstellung (bei der nur das höchstwertige Bit als Vorzeichen dient) und das Einerkomplement (einfaches Invertieren der Bits einer positiven Zahl) verwendet. Beide teilen einen gemeinsamen Nachteil: Es entstehen zwei unterschiedliche Bitmuster für null, „+0“ und „-0“, was die Vergleichslogik und das Schaltungsdesign verkompliziert. Das Zweierkomplement vermeidet dieses „Zwei-Nullen-Problem“ vollständig – jedes Bitmuster entspricht genau einem ganzzahligen Wert.

Ein noch größerer Vorteil des Zweierkomplements ist, dass dieselbe Addierschaltung, die für die Addition verwendet wird, auch die Subtraktion durchführen kann, da das Subtrahieren einer Zahl der Addition ihres Zweierkomplements entspricht. Die CPU muss nicht wissen oder sich darum kümmern, ob ein Wert positiv oder negativ ist – sie addiert einfach Bitmuster und erhält in beiden Fällen das richtige Ergebnis. Dadurch kann die arithmetisch-logische Einheit (ALU) vollständig auf eine eigene Subtraktionsschaltung verzichten, weshalb sich praktisch jede moderne CPU-Architektur für das Zweierkomplement bei vorzeichenbehafteten Ganzzahlen entschieden hat.

Ein Ganzzahlüberlauf ist eine direkte Folge dieser Darstellung. Addiert man 1 zum vorzeichenbehafteten 8-Bit-Maximum 127 (01111111), springt das Bitmuster einfach auf 10000000 um – als vorzeichenbehafteter Wert gelesen ist das -128. In C ist ein vorzeichenbehafteter Ganzzahlüberlauf technisch gesehen undefiniertes Verhalten, sodass Compiler-Optimierungen in der Nähe dieser Grenze überraschende Ergebnisse liefern können, weshalb im Produktivcode echte Vorsicht geboten ist. Java hingegen legt fest, dass ein Überlauf stillschweigend umschlägt – ein interessantes Beispiel dafür, wie unterschiedlich die Verhaltensgarantien zwischen Sprachen sein können, obwohl die zugrunde liegende Bitdarstellung identisch ist.