Was ist −5 im 8-Bit-Zweierkomplement?
11111011 11111011, also 0xFB.
Ganzzahl mit Vorzeichen eingeben und Betrag-Vorzeichen, Einerkomplement, Zweierkomplement und Offset-Binär auf einmal erhalten, von 4 bis 64 Bit. Oder ein Bitmuster bzw. Hex-Byte einfügen und alle fünf Lesarten sehen.
Geben Sie eine ganze Zahl mit Vorzeichen ein. Alle vier Darstellungen werden auf einmal berechnet — Sie müssen nicht vorher wissen, welche Ihr System verwendet.
| Kodierung | Bits | Hex |
|---|---|---|
| Betrag-Vorzeichen | 1000 0101 | 85 |
| Einerkomplement | 1111 1010 | FA |
| Zweierkomplement | 1111 1011 | FB |
| Offset-Binär | 0111 1011 | 7B |
Betrag-Vorzeichen und Einerkomplement geben je ein Bitmuster für die negative Null aus, fassen deshalb einen Wert weniger als das Zweierkomplement und erreichen die kleinste negative Zahl nicht.
Sie haben ein Byte in einem Speicherauszug oder einem Register gefunden und wissen nicht, wie es gelesen werden soll. Fügen Sie es ein und sehen Sie auf einen Blick, was es unter jeder Deutung bedeutet — welche richtig ist, hängt vom erzeugenden System ab, deshalb werden alle angezeigt.
| Gelesen als | Wert |
|---|---|
| Vorzeichenlos | 251 |
| Betrag-Vorzeichen | -123 |
| Einerkomplement | -4 |
| Zweierkomplement | -5 |
| Offset-Binär | 123 |
Von derselben Engine berechnet, die das Werkzeug oben verwendet, diese Werte können also nicht davon abweichen.
| Dezimal | Betrag-Vorzeichen | Einerkomplement | Zweierkomplement | Offset-Binär | Hex |
|---|---|---|---|---|---|
| 127 | 0111 1111 | 0111 1111 | 0111 1111 | 1111 1111 | 7F |
| 100 | 0110 0100 | 0110 0100 | 0110 0100 | 1110 0100 | 64 |
| 10 | 0000 1010 | 0000 1010 | 0000 1010 | 1000 1010 | 0A |
| 5 | 0000 0101 | 0000 0101 | 0000 0101 | 1000 0101 | 05 |
| 1 | 0000 0001 | 0000 0001 | 0000 0001 | 1000 0001 | 01 |
| 0 | 0000 0000 | 0000 0000 | 0000 0000 | 1000 0000 | 00 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 | 0111 1111 | FF |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 | 0111 1011 | FB |
| -10 | 1000 1010 | 1111 0101 | 1111 0110 | 0111 0110 | F6 |
| -100 | 1110 0100 | 1001 1011 | 1001 1100 | 0001 1100 | 9C |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 | 0000 0001 | 81 |
| -128 | — | — | 1000 0000 | 0000 0000 | 80 |
| Breite | Zweierkomplement / Offset-Binär | Betrag-Vorzeichen / Einerkomplement |
|---|---|---|
| 4 | -8 … 7 | -7 … 7 |
| 8 | -128 … 127 | -127 … 127 |
| 16 | -32768 … 32767 | -32767 … 32767 |
| 32 | -2147483648 … 2147483647 | -2147483647 … 2147483647 |
| 64 | -9223372036854775808 … 9223372036854775807 | -9223372036854775807 … 9223372036854775807 |
Vom Engineering-Team von Go Tools gebaut und geprüft.
11111011 11111011, also 0xFB.
-128 … 127 −128 bis 127 im Zweierkomplement; −127 bis 127 in Betrag-Vorzeichen und Einerkomplement.
Wert − 2^n Ist das oberste Bit 0, lesen Sie es vorzeichenlos; ist es 1, ziehen Sie 2^n von der vorzeichenlosen Lesart ab.
−1 oder 255 −1 als vorzeichenbehaftetes Byte, 255 als vorzeichenloses. Die Bits allein entscheiden das nicht.
Das Zweierkomplement beantwortet eine Hardware-Frage, keine mathematische: Wie speichert man negative Zahlen so, dass der bereits gebaute Addierer weiterhin funktioniert? Der Kniff besteht darin, −x durch das Muster von 2^n − x darzustellen. Die Addition läuft dann modulo 2^n um und trifft ohne jeden Sonderfall für Vorzeichen die richtige Antwort, weshalb die Subtraktion keine eigene Schaltung braucht.
Daraus folgen zwei Dinge, und beide tauchen in echten Fehlern auf. Erstens ist der Wertebereich unsymmetrisch: Acht Bit decken −128 bis 127 ab, nicht −128 bis 128, denn die Muster müssen aufgeteilt werden und es gibt keine negative Null, die das ausgleichen würde. Zweitens ist das Vorzeichen kein Flag, das man abstreifen kann — das oberste Bit von 11111011 ist 1, der Wert aber −5 und nicht −123, eine negative Zahl zu lesen heißt also, das ganze Wort zu deuten und nicht nur ein Bit anzusehen.
Betrag-Vorzeichen und Einerkomplement sind die beiden unterlegenen Entwürfe. Sie zu kennen lohnt sich trotzdem, weil IEEE-754-Gleitkomma das Betrag-Vorzeichen-Layout übernommen hat und weil erst der Vergleich das Zweierkomplement zwangsläufig statt willkürlich erscheinen lässt.
// -5 as an 8-bit byte, three ways to arrive at the same pattern 0b00000101 // 5 ~0b00000101 // 11111010 ones' complement of 5 ~0b00000101 + 1 // 11111011 two's complement = -5 // In JavaScript the width matters: bitwise operators are 32-bit, // so anything wider has to go through BigInt. BigInt.asIntN(8, 0xFBn) // -5n BigInt.asUintN(8, -5n) // 251n BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n // C23 made two's complement mandatory for signed integers. // Before that, the other two encodings were legal but unused.
Betrag-Vorzeichen, Einerkomplement, Zweierkomplement und Offset-Binär werden gemeinsam berechnet. Offset-Binär ist das, was die meisten Rechner weglassen — und genau das, was ADC-Datenblätter weiterhin verwenden.
Fügen Sie die Bits oder das Hex ein, die Sie tatsächlich haben, und sehen Sie alle fünf Lesarten, die vorzeichenlose eingeschlossen. Diese Richtung brauchen Sie, wenn ein Speicherauszug der vom Gerät gemeldeten Zahl widerspricht.
Jeder Wert wird mit BigInt behandelt, deshalb ergibt 0xFFFFFFFFFFFFFF9C tatsächlich −100 und nicht das, was eine Kürzung auf 32 Bit übrig ließe.
Bei Breite 8 hat −128 weder eine Betrag-Vorzeichen- noch eine Einerkomplement-Form. Die Tabelle sagt das, statt ein Muster auszugeben, das diese Zahl gar nicht bedeutet.
Geben Sie 0 ein, und das zweite Bitmuster der Null in Betrag-Vorzeichen und Einerkomplement wird angezeigt — das ist das deutlichste einzelne Argument dafür, warum sich das Zweierkomplement durchgesetzt hat.
Die 8-Bit-Vergleichstabelle und die Wertebereiche je Breite werden beim Bau der Seite von derselben Engine gerendert, die auch die interaktiven Felder speist, und können deshalb nicht von ihr abweichen.
BigInt.asIntN, Pythons int.from_bytes(..., signed=True) und die Typen fester Breite in C liefern die verbindliche Antwort für den Code, den Sie schreiben. Benutzen Sie sie im Code; benutzen Sie diese Seite, wenn Sie einen Wert vor sich haben und keinen Interpreter offen.
Sie zeigt den Wert mit dem Typ, den das Programm deklariert hat — genau die Information, die einem Bitmuster fehlt. Sie hilft nicht, wenn die Bytes ohne deklarierten Typ über eine Leitung eingetroffen sind, und für diesen Fall ist diese Seite da.
Er rechnet zwischen Zahlensystemen um, aber nur für nichtnegative Werte — negative werden dort ausdrücklich abgelehnt, weil ein Zahlensystem keine Meinung dazu hat, wie ein Vorzeichen gespeichert wird. Die vorzeichenbehaftete Darstellung ist Aufgabe dieser Seite; für Beträge nehmen Sie den Zahlensystem-Konverter.
Das Gegenstück für Gleitkomma. Er behält ein Betrag-Vorzeichen-Layout statt eines Zweierkomplements und spannt den Exponenten mit 2^(e−1)−1 vor, sodass die beiden Seiten verschiedene Fragen zum selben Speicherwort beantworten.
-5, Breite 8
Betrag-Vorzeichen 1000 0101 Einerkomplement 1111 1010 Zweierkomplement 1111 1011 (0xFB) Offset-Binär 0111 1011
Die drei Kodierungen stimmen im Vorzeichenbit überein und weichen sonst überall voneinander ab. Nur die Zeile des Zweierkomplements ist das, was ein int8_t in C tatsächlich enthält.
0xFB, Breite 8
vorzeichenlos 251 Betrag-Vorzeichen -123 Einerkomplement -4 Zweierkomplement -5 Offset-Binär 123
-128, Breite 8
Betrag-Vorzeichen keine Darstellung Einerkomplement keine Darstellung Zweierkomplement 1000 0000 (0x80) Offset-Binär 0000 0000
Betrag-Vorzeichen und Einerkomplement geben je ein Bitmuster für die negative Null aus, reichen deshalb nur von −127 bis 127 und erreichen −128 nicht. Werkzeuge, die hier ein Byte ausgeben, irren sich.
0xFFFFFFFFFFFFFF9C, Breite 64
Zweierkomplement -100 vorzeichenlos 18446744073709551516
Alles jenseits von 32 Bit muss über BigInt laufen. Die JavaScript-Operatoren |, << und >>> kürzen stillschweigend auf 32 Bit, weshalb manche Online-Rechner hier eine falsche Antwort statt einer Fehlermeldung liefern.
4, 8, 16, 32 oder 64. Das ist keine Anzeigeeinstellung: Dieselben Bits bedeuten bei unterschiedlicher Breite unterschiedliche Zahlen, eine falsche Wahl ändert also die Antwort.
Geben Sie eine ganze Zahl ein, Minuszeichen eingeschlossen. Alle vier Kodierungen aktualisieren sich beim Tippen, jeweils zusammen mit ihrer Hexadezimalform.
Fügen Sie eine Binärkette oder einen 0x-Wert in das Rückwärtsfeld ein, um zu sehen, was genau dieses Muster unter jeder Deutung bedeutet, die vorzeichenlose Lesart eingeschlossen.
Die Seite markiert die beiden Fälle, über die alle stolpern: Der kleinste negative Wert hat weder eine Betrag-Vorzeichen- noch eine Einerkomplement-Form, und die Null hat in diesen beiden Kodierungen ein zweites Bitmuster.
Das Invertieren der Bits liefert das Einerkomplement. Dort stehenzubleiben liegt um eins neben dem Zweierkomplement, und der Fehler fällt leicht durch, weil das Ergebnis immer noch wie eine plausible negative Zahl aussieht.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
JavaScript kürzt die Operanden von Bitoperatoren auf 32 Bit. Die obere Hälfte verschwindet ohne Fehlermeldung, das Ergebnis ist also falsch statt abwesend.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
Das Auffüllen mit Nullen erhält die Zahl nur, solange sie positiv ist. Bei einem negativen Wert muss das Vorzeichenbit über alle neuen Bits wiederholt werden.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
−128 hat in acht Bit weder eine Betrag-Vorzeichen- noch eine Einerkomplement-Darstellung, weil beide Kodierungen je ein Muster für die negative Null ausgeben. Dafür 10000000 auszugeben verwechselt die Antwort des Zweierkomplements mit einer Kodierung, die diese Zahl gar nicht ausdrücken kann.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
0xFF9C. Vorzeichenlos sind das 65436, was keine Temperatur ist. Bei Breite 16 zeigt die Zweierkomplement-Zeile −100, und mit einem Skalenfaktor von 0,1 °C meldet der Sensor −10,0 °C.n−1 Bit tragen den Betrag, gelesen als schlichte vorzeichenlose Zahl. Der Bereich reicht von −(2^(n−1)−1) bis 2^(n−1)−1, ist symmetrisch und hat zwei Nullen. Es ist das Layout, das IEEE 754 für Gleitkomma verwendet.2^n − 1 − x. Gleicher Bereich und dieselben zwei Nullen wie beim Betrag-Vorzeichen. Die Addition braucht einen Ringübertrag, und genau diese Komplikation räumt das Zweierkomplement aus dem Weg. Die Stellung des Apostrophs im Englischen ist kein Tippfehler: ones' complement bezieht sich auf ein Wort aus lauter Einsen, two's complement dagegen auf eine einzelne Zweierpotenz.−x wird als 2^n − x abgelegt. Der Bereich reicht von −2^(n−1) bis 2^(n−1)−1, ist absichtlich unsymmetrisch und hat eine Null. Addition, Subtraktion und die Multiplikation des unteren Worts sind allesamt vorzeichenunabhängig, und das ist der ganze Grund für seinen Sieg.Wert + 2^(n−1), sodass −2^(n−1) zu lauter Nullen wird und die Muster in derselben Reihenfolge sortieren wie die Werte, die sie kodieren. Es entspricht dem Zweierkomplement-Muster mit gekipptem obersten Bit. Vorsicht bei der Benennung: IEEE-754-Exponentenfelder sind mit 2^(e−1)−1 vorgespannt, also um eins weniger als der hier verwendete Offset.&, |, ~ und den Schiebeoperatoren vor der Operation in 32-Bit-Ganzzahlen um und danach zurück, wodurch ein 64-Bit-Wert seine obere Hälfte verliert, ohne dass ein Fehler ausgelöst wird. Jede Umrechnung auf dieser Seite erfolgt stattdessen auf Ganzzahlen beliebiger Genauigkeit, weshalb auch die 64-Bit-Extremwerte exakt herauskommen.−(−128) für ein vorzeichenbehaftetes Byte immer noch −128. Jeder Code, der einen Betrag bildet, braucht einen Plan für diese Eingabe, und jede Testsuite sollte sie enthalten.0xFB als 0x00FB in ein 16-Bit-Feld zu kopieren macht aus −5 die Zahl 251. Einen vorzeichenbehafteten Wert zu verbreitern heißt, das Vorzeichenbit zu wiederholen, was 0xFFFB ergibt.BigInt.asIntN in JavaScript, int.from_bytes(..., signed=True) in Python und Typen fester Breite in C sagen, was sie meinen, und behandeln die Randfälle. Handgeschriebenes ~x + 1 ist die Quelle der Breitenfehler.2^n − x abzulegen, wodurch Addition und Subtraktion dieselbe Schaltung benutzen und der Zahlenstrahl genau eine Null bekommt. 00000101 → 11111010 → 11111011. Allein das Kippen liefert das Einerkomplement, weshalb die beiden immer genau um eins auseinanderliegen. n Bit deckt es −2^(n−1) bis 2^(n−1)−1 ab, weil es kein Muster für die negative Null verschwendet, wie es Betrag-Vorzeichen und Einerkomplement tun. Der dadurch frei werdende Platz landet auf der negativen Seite. int8_t oder uint8_t passt. Wert + 2^(n−1), sodass der kleinste Wert nur aus Nullen besteht und eine Sortierung der rohen Muster als vorzeichenlose Ganzzahlen zugleich die vorzeichenbehafteten Werte sortiert. Es taucht in ADC- und DAC-Ausgaben und in Audio-Sampleformaten auf. Beachten Sie: IEEE-754-Exponenten verwenden einen anderen Bias — 2^(e−1)−1, nicht 2^(e−1) — übertragen Sie die Zahl also nicht von einem Fall auf den anderen. 65436 aus, während das Gerät den Zweierkomplement-Wert −100 gemeint hat. Fügen Sie 65436 hier als Hexwert 0xFF9C mit Breite 16 ein, und die Zeile des Zweierkomplements zeigt die gemeinte Lesart. ~x + 1 verwendet, die obere Hälfte eines 64-Bit-Werts stillschweigend und meldet ein plausibles, aber falsches Ergebnis. Dieses Werkzeug arbeitet durchgehend mit BigInt, weshalb die 64-Bit-Zeilen hier mit dem übereinstimmen, was Ihr Debugger anzeigt. 00000000 und 10000000 beide Null; im Einerkomplement sind es 00000000 und 11111111. Zwei Vergleiche, die gleich sein müssten, können also bitweise ungleich ausfallen. Das Zweierkomplement hat nur eine Null, was eine ganze Klasse von Sonderfällen in der Hardware beseitigt hat. Konvertierungswerkzeuge
Zahlen zwischen Binär, Hexadezimal, Dezimal, Oktal und beliebigen Basen (2–36) sofort konvertieren. Kostenlos, privat, ohne Anmeldung — alles läuft in Ihrem Browser.
Konvertierungswerkzeuge
Linux-Dateiberechtigungen zwischen Oktal (755, 644) und rwx-Symbolen umrechnen. chmod-Befehle kopieren, riskante Modi wie 777 erkennen — kostenlos, direkt im Browser.
Konvertierungswerkzeuge
Konvertieren Sie HEX zu RGB, HSL, OKLCH, OKLAB und CMYK direkt im Browser — jedes Format mit einem Klick kopieren. Kostenlos, ohne Anmeldung, Ihre Farben verlassen die Seite nie.
Konvertierungswerkzeuge
Konvertieren Sie HEX-Farben direkt im Browser in CMYK. Naive sRGB-basierte Näherung für Druckvorschauen. Kostenlos, ohne Anmeldung, Ihre Farben bleiben lokal.
Konvertierungswerkzeuge
Konvertieren Sie jede HEX-Farbe direkt im Browser in HSL — 3-stellig, 6-stellig und 8-stellig mit Alpha werden unterstützt. Kostenlos, sofort, ohne Anmeldung, Ihre Farben verlassen die Seite nie.
Konvertierungswerkzeuge
Konvertieren Sie HEX in OKLCH für Tailwind-v4-Design-Tokens. Perzeptuell uniforme Live-Ausgabe mit Display-P3-Farbraum-Warnungen. Kostenlos, ausschließlich im Browser.