Was ist "2's Complement"?

434

Ich bin in einem Computersystemkurs und habe teilweise mit Two's Complement zu kämpfen . Ich möchte es verstehen, aber alles, was ich gelesen habe, hat das Bild nicht für mich zusammengebracht. Ich habe den Wikipedia-Artikel und verschiedene andere Artikel gelesen , einschließlich meines Lehrbuchs .

Daher wollte ich diesen Community-Wiki- Beitrag starten , um zu definieren, was Two's Complement ist, wie es verwendet wird und wie es Zahlen bei Operationen wie Casts (von vorzeichenbehafteten zu vorzeichenlosen und umgekehrt), bitweisen Operationen und Bitverschiebungsoperationen beeinflussen kann .

Was ich mir erhoffe, ist eine klare und präzise Definition , die von einem Programmierer leicht verstanden wird.

Frank V.
quelle

Antworten:

627

Das Zweierkomplement ist eine clevere Methode zum Speichern von Ganzzahlen, sodass häufig auftretende mathematische Probleme sehr einfach zu implementieren sind.

Um zu verstehen, müssen Sie an die Zahlen in Binärform denken.

Es heißt im Grunde:

  • Verwenden Sie für Null alle Nullen.
  • Beginnen Sie bei positiven Ganzzahlen mit dem Hochzählen mit maximal 2 (Anzahl der Bits - 1) -1.
  • Machen Sie bei negativen ganzen Zahlen genau das Gleiche, aber wechseln Sie die Rolle von Nullen und Einsen (anstatt mit 0000 zu beginnen, beginnen Sie mit 1111 - das ist der "Komplement" -Teil).

Versuchen wir es mit einem Mini-Byte von 4 Bits (wir nennen es ein Nibble - 1/2 Byte).

  • 0000 - Null
  • 0001 - einer
  • 0010 - zwei
  • 0011 - drei
  • 0100bis 0111- vier bis sieben

So weit können wir positiv gehen. 2 3 -1 = 7.

Für Negative:

  • 1111 - negativ
  • 1110 - negative zwei
  • 1101 - negative drei
  • 1100zu 1000- negativ vier zu negativ acht

Beachten Sie, dass Sie einen zusätzlichen Wert für Negative ( 1000= -8) erhalten, den Sie für Positive nicht erhalten. Dies liegt daran 0000, dass für Null verwendet wird. Dies kann als Anzahl der Computer angesehen werden.

Unterscheidung zwischen positiven und negativen Zahlen

Dabei erhält das erste Bit die Rolle des "Vorzeichen" -Bits, da damit zwischen nichtnegativen und negativen Dezimalwerten unterschieden werden kann. Wenn das höchstwertige Bit ist 1, kann die Binärdatei als negativ bezeichnet werden. Wenn das höchstwertige Bit (ganz links) ist 0, können Sie sagen, dass der Dezimalwert nicht negativ ist.

Negative Zahlen "Ein Komplement" kippen nur das Vorzeichenbit um und zählen dann von 0. Dieser Ansatz muss sich jedoch mit der Interpretation 1000als "negative Null" befassen, was verwirrend ist. Sie müssen sich im Allgemeinen nur darum kümmern, wenn Sie in der Nähe der Hardware arbeiten.

Lavinio
quelle
146
Wahrscheinlich ist der beste Teil des Zweierkomplements, wie es die Mathematik vereinfacht. Wenn Sie 2 (0010) und -2 (1110) addieren, erhalten Sie 10000. Das wichtigste Bit ist der Überlauf, das Ergebnis ist also tatsächlich 0000. Fast wie durch Zauberei ist 2 + -2 = 0.
Naaff
96
Ein weiterer Vorteil neben der einfachen Addition und Subtraktion ist, dass das 2s-Komplement nur eine Null hat. Wenn Sie ein einfaches Vorzeichenbit verwenden, z. B. 0001 für +1 und 1001 für -1, hätten Sie zwei Nullen: 0000 ("+0") und 1000 ("-0"). Das ist ein echter Schmerz im Hintern.
Jörg W Mittag
26
Stimmen Sie dafür ab, dass es auf den Punkt kommt und erklären Sie auch, warum die negativen Werte einen größeren Bereich haben als die positiven. Ich habe nach dem Grund für den Entfernungsunterschied gesucht.
Ashwin
2
Sollten Sie nicht sagen "für negative ganze Zahlen, machen Sie genau das Gleiche, aber zählen Sie herunter und wechseln Sie die Rolle der
Nullen und Einsen
1
Genial. Zusätzliche Teile der Konvertierung von Bits in negative Ganzzahlen hinzugefügt.
Suraj Jain
339

Ich frage mich, ob es besser erklärt werden könnte als der Wikipedia-Artikel.

Das Grundproblem, das Sie mit der Zweierkomplementdarstellung lösen möchten, ist das Problem des Speicherns negativer Ganzzahlen.

Betrachten Sie zunächst eine vorzeichenlose Ganzzahl, die in 4 Bits gespeichert ist. Sie können Folgendes haben

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Diese sind nicht signiert, da es keinen Hinweis darauf gibt, ob sie negativ oder positiv sind.

Vorzeichengröße und Überschussnotation

Um negative Zahlen zu speichern, können Sie eine Reihe von Dingen ausprobieren. Zunächst können Sie die Vorzeichengrößen-Notation verwenden, bei der das erste Bit als Vorzeichenbit zur Darstellung von +/- und die verbleibenden Bits zur Darstellung der Größe zugewiesen werden. Verwenden Sie also wieder 4 Bits und nehmen Sie an, dass 1 bedeutet - und 0 bedeutet +, dann haben Sie

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Siehst du das Problem dort? Wir haben positive und negative 0. Das größere Problem ist das Addieren und Subtrahieren von Binärzahlen. Die Schaltungen, die unter Verwendung der Vorzeichengröße addiert und subtrahiert werden müssen, sind sehr komplex.

Was ist

0010
1001 +
----

?

Ein anderes System ist die überschüssige Notation . Sie können negative Zahlen speichern, Sie werden das Problem der zwei Nullen los, aber Addition und Subtraktion bleiben schwierig.

So kommt die Ergänzung von zwei. Jetzt können Sie positive und negative Ganzzahlen speichern und relativ einfach rechnen. Es gibt eine Reihe von Methoden, um eine Zahl in ein Zweierkomplement umzuwandeln. Hier ist eine.

Konvertieren Sie Dezimal in Zweierkomplement

  1. Konvertieren Sie die Zahl in eine Binärzahl (ignorieren Sie das Vorzeichen vorerst), z. B. 5 ist 0101 und -5 ist 0101

  2. Wenn die Zahl eine positive Zahl ist, sind Sie fertig. zB 5 ist 0101 in binärer Form unter Verwendung der Zweierkomplementnotation.

  3. Wenn die Zahl negativ ist, dann

    3.1 finde das Komplement (invertiere Nullen und Einsen), zB -5 ist 0101, also finde das Komplement 1010

    3.2 Addiere 1 zum Komplement 1010 + 1 = 1011. Daher ist -5 im Zweierkomplement 1011.

Was wäre, wenn Sie 2 + (-3) binär machen wollten? 2 + (-3) ist -1. Was müssten Sie tun, wenn Sie diese Zahlen mit der Vorzeichengröße addieren würden? 0010 + 1101 =?

Verwenden Sie das Zweierkomplement, um zu überlegen, wie einfach es wäre.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Zweierkomplement in Dezimal umwandeln

1111 in Dezimal umwandeln:

  1. Die Zahl beginnt mit 1, ist also negativ, also finden wir das Komplement von 1111, das 0000 ist.

  2. Addiere 1 zu 0000 und wir erhalten 0001.

  3. Konvertieren Sie 0001 in eine Dezimalzahl (1).

  4. Wenden Sie das Vorzeichen = -1 an.

Tada!

Vincent Ramdhanie
quelle
45
Beste Antwort meiner Meinung nach.
Koray Tugay
5
Ja, dieser ist ziemlich einfach und erklärt die Sache sehr gut
Max Koretskyi
3
Ich verstehe nicht, wie das Hinzufügen einer beim Konvertieren in beide Richtungen immer zur gleichen Zahl führt. In meinen Gedanken würden Sie die Schritte umkehren oder einen oder etwas subtrahieren.
Marcos Pereira
2
Warum 1 zum Komplement hinzufügen?
Zinan Xing
4
Diese Antwort sollte auf Wikipedia verwendet werden.
Hiroki
119

Wie die meisten Erklärungen ich gesehen habe, über diejenigen sind klar darüber , wie mit 2-Komplement zu arbeiten, aber nicht wirklich erklären , was sie sind mathematisch. Ich werde versuchen, dies zumindest für ganze Zahlen zu tun, und ich werde einige Hintergründe behandeln, die wahrscheinlich zuerst bekannt sind.

Erinnern Sie sich, wie es für Dezimalstellen funktioniert:
   2345
ist eine Schreibweise für
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

Auf die gleiche Weise ist Binär eine Methode, Zahlen mit nur 0 und 1 nach der gleichen allgemeinen Idee zu schreiben , aber die obigen 10s durch 2s zu ersetzen. Dann in binär,
   1111
eine Art,
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 zu schreiben,
und wenn Sie es herausarbeiten, ergibt sich 15 (Basis 10). Das liegt daran, dass es
  8 + 4 + 2 + 1 = 15 ist.

Das ist alles gut und schön für positive Zahlen. Es funktioniert sogar bei negativen Zahlen, wenn Sie bereit sind, nur ein Minuszeichen vor sie zu setzen, wie es Menschen mit Dezimalzahlen tun. Das kann man sogar in Computern machen, aber ich habe einen solchen Computer seit den frühen 1970ern nicht mehr gesehen. Ich werde die Gründe für eine andere Diskussion hinterlassen.

Für Computer erweist es sich als effizienter, eine Komplementdarstellung für negative Zahlen zu verwenden. Und hier ist etwas, das oft übersehen wird. Komplementnotationen beinhalten eine Art Umkehrung der Ziffern der Zahl, sogar der implizierten Nullen, die vor einer normalen positiven Zahl stehen. Das ist umständlich, denn es stellt sich die Frage: Alle? Das könnte eine unendliche Anzahl von Ziffern sein, die berücksichtigt werden müssen.

Glücklicherweise repräsentieren Computer keine Unendlichkeiten. Zahlen sind auf eine bestimmte Länge (oder Breite, wenn Sie dies bevorzugen) beschränkt. Kehren wir also zu positiven Binärzahlen zurück, jedoch mit einer bestimmten Größe. Ich werde 8 Ziffern ("Bits") für diese Beispiele verwenden. Unsere Binärzahl wäre also wirklich
  00001111
oder
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Um das 2er-Komplement negativ zu bilden, ergänzen wir zuerst alle (binären) Ziffern, um
  11110000 zu bilden,
und addieren 1, um
  11110001 zu bilden. Aber
wie sollen wir das verstehen, um -15 zu bedeuten?

Die Antwort ist, dass wir die Bedeutung des höherwertigen Bits (des ganz linken) ändern. Dieses Bit ist eine 1 für alle negativen Zahlen. Die Änderung besteht darin, das Vorzeichen seines Beitrags zum Wert der Zahl zu ändern, in der es erscheint. Nun wird unser 11110001 so verstanden, dass er
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + darstellt 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Beachten Sie, dass "-" vor diesem Ausdruck steht? Dies bedeutet, dass das Vorzeichenbit das Gewicht -2 7 trägt, dh -128 (Basis 10). Alle anderen Positionen behalten das gleiche Gewicht wie vorzeichenlose Binärzahlen.

Wenn Sie unsere -15 berechnen , ist es
  -128 + 64 + 32 + 16 + 1.
Probieren Sie es auf Ihrem Taschenrechner aus. es ist -15.

Von den drei Hauptmethoden, mit denen ich negative Zahlen in Computern gesehen habe, gewinnt das Komplement von 2 zweifellos, um die allgemeine Verwendung zu vereinfachen. Es hat jedoch eine Seltsamkeit. Da es binär ist, muss es eine gerade Anzahl möglicher Bitkombinationen geben. Jede positive Zahl kann mit ihrer negativen gepaart werden, aber es gibt nur eine Null. Wenn Sie eine Null negieren, erhalten Sie eine Null. Es gibt also noch eine Kombination, die Zahl mit 1 im Vorzeichenbit und 0 überall sonst. Die entsprechende positive Zahl würde nicht in die Anzahl der verwendeten Bits passen.

Was noch seltsamer an dieser Zahl ist, ist, dass Sie dieselbe negative Zahl zurückerhalten, wenn Sie versuchen, ihr Positiv durch Ergänzen und Hinzufügen einer zu bilden. Es scheint natürlich, dass Null dies tun würde, aber dies ist unerwartet und überhaupt nicht das Verhalten, an das wir gewöhnt sind, da wir, abgesehen von Computern, im Allgemeinen an eine unbegrenzte Anzahl von Ziffern denken, nicht an diese Arithmetik mit fester Länge.

Dies ist wie die Spitze eines Eisbergs voller Kuriositäten. Unter der Oberfläche lauert noch mehr, aber das reicht für diese Diskussion. Sie könnten wahrscheinlich mehr finden, wenn Sie nach "Überlauf" für Festkomma-Arithmetik suchen. Wenn Sie sich wirklich darauf einlassen möchten, können Sie auch "modulare Arithmetik" erforschen.

ForDummies
quelle
1
Ich mag diese Antwort! Erklärt, wie es funktioniert, 2s zu ergänzen und eins hinzuzufügen.
SJ.
Diese Antwort gefällt mir auch. Besonders dort, wo Sie zeigen, wie die negative Zahl dargestellt wird. Hier dachte ich, die ganze Zahl sei invertiert, nicht nur das MSB, und addierte dann die anderen gewichteten Werte zurück. Vielen Dank, dies löste meine Gehirnblockade
user188757
Gute Arbeit, wenn man die ungerade Zahl erwähnt, die keine Umkehrung hat. Aber was machen wir dagegen? Setzen wir nur das Überlauf-Flag, wenn jemand versucht, es zu invertieren?
NH.
Während sich andere Antworten auf das "Wie" konzentrieren, führt uns diese Antwort sanft mit dem "Warum". Es hat mir geholfen. Vielen Dank!
Abhishek Pathak
Wenn eine Zahl mit 11000 ... 000 endet, ergibt das Invertieren 01000 ... 000. Die Zweierkomplementnotation basiert auf der Idee, dass alle Ziffern links von der am weitesten links dargestellten Ziffer den gleichen Wert wie diese Ziffer haben sollten. Wenn Sie jedoch eine Zahl invertieren, deren Darstellung 1000 ... 000 ist, ist dies nicht der Fall.
Supercat
20

Das Komplement von 2 ist sehr nützlich, um den Wert einer Binärdatei zu ermitteln. Ich habe mir jedoch eine viel präzisere Methode zur Lösung eines solchen Problems überlegt (ich habe noch nie jemanden gesehen, der es veröffentlicht):

Nehmen Sie zum Beispiel eine Binärdatei: 1101, die [unter der Annahme, dass das Leerzeichen "1" das Vorzeichen ist] gleich ist -3 ist .

Mit dem 2er-Komplement würden wir dies tun ... 1101 auf 0010 drehen ... 0001 + 0010 hinzufügen ===> ergibt 0011. 0011 in positiver Binärzahl = 3. daher 1101 = -3 !

Was mir klar wurde:

Anstatt alles umzudrehen und hinzuzufügen, können Sie einfach die grundlegende Methode zum Lösen einer positiven Binärdatei (sagen wir 0101) ausführen: (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Machen Sie genau das gleiche Konzept mit einem Negativ! (Mit einer kleinen Drehung)

Nehmen Sie zum Beispiel 1101:

für die erste Zahl anstelle von 2 3 * 1 = 8 tun Sie - (2 3 * 1) = -8 .

Fahren Sie dann wie gewohnt fort und machen Sie -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3

Simon Yundov
quelle
1
Am besten konnte ich die Ergänzung von 2 verstehen. Nachdem ich dies gelesen hatte, konnte ich alle Antworten auf die obige Frage verstehen.
Shakeel Shahzad
1
Diese Methode wird im Buch Computersysteme: Die Perspektive eines Programmierers erwähnt.
Jimo
1
Dies ist ein viel schnellerer Weg!
Chanzerre
14

Stellen Sie sich vor, Sie haben eine endliche Anzahl von Bits / Trits / Ziffern / was auch immer. Sie definieren 0 als alle Ziffern, die 0 sind, und zählen natürlich nach oben:

00
01
02
..

Schließlich werden Sie überlaufen.

98
99
00

Wir haben zwei Ziffern und können alle Zahlen von 0 bis 100 darstellen. Alle diese Zahlen sind positiv! Angenommen, wir möchten auch negative Zahlen darstellen?

Was wir wirklich haben, ist ein Zyklus. Die Zahl vor 2 ist 1. Die Zahl vor 1 ist 0. Die Zahl vor 0 ist ... 99 .

Nehmen wir der Einfachheit halber an, dass jede Zahl über 50 negativ ist. "0" bis "49" stehen für 0 bis 49. "99" ist -1, "98" ist -2, ... "50" ist -50.

Diese Darstellung ist das Zehner-Komplement . Computer verwenden normalerweise das Zweierkomplement , das identisch ist, außer dass Bits anstelle von Ziffern verwendet werden.

Das Schöne an der Zehner-Ergänzung ist, dass die Addition einfach funktioniert . Sie müssen nichts Besonderes tun, um positive und negative Zahlen hinzuzufügen!

Kapitän Segfault
quelle
9

Ich habe eine fantastische Erklärung zu Reddit von jng gelesen, wobei ich den Kilometerzähler als Analogie verwendet habe.

Geben Sie hier die Bildbeschreibung ein

Es ist eine nützliche Konvention. Dieselben Schaltungen und Logikoperationen, die positive Zahlen in Binärzahlen addieren / subtrahieren, funktionieren bei Verwendung der Konvention immer noch sowohl für positive als auch für negative Zahlen. Deshalb ist sie so nützlich und allgegenwärtig.

Stellen Sie sich den Kilometerzähler eines Autos vor, er rollt bei (sagen wir) 99999 herum. Wenn Sie 00000 erhöhen, erhalten Sie 00001. Wenn Sie 00000 verringern, erhalten Sie 99999 (aufgrund des Roll-arounds). Wenn Sie 99999 wieder hinzufügen, geht es zurück zu 00000. Daher ist es hilfreich zu entscheiden, dass 99999 -1 darstellt. Ebenso ist es sehr nützlich zu entscheiden, dass 99998 -2 darstellt, und so weiter. Sie müssen irgendwo anhalten, und auch gemäß Konvention wird die obere Hälfte der Zahlen als negativ angesehen (50000-99999), und die untere Hälfte positiv steht nur für sich selbst (00000-49999). Infolgedessen bedeutet die obere Ziffer 5-9, dass die dargestellte Zahl negativ ist, und 0-4 bedeutet, dass die dargestellte Zahl positiv ist - genau das gleiche wie das obere Bit, das das Vorzeichen in einer Zweierkomplement-Binärzahl darstellt.

Das zu verstehen war auch für mich schwer. Nachdem ich es bekommen und die Artikel und Erklärungen der Bücher noch einmal gelesen hatte (es gab damals kein Internet), stellte sich heraus, dass viele, die es beschrieben, es nicht wirklich verstanden hatten. Danach habe ich ein Buch geschrieben, in dem Assemblersprache unterrichtet wird (was sich 10 Jahre lang recht gut verkaufte).

Alister
quelle
5

Zwei Komplemente werden herausgefunden, indem eins zu 1'-Komplement der gegebenen Zahl addiert wird. Nehmen wir an, wir müssen zwei Komplemente herausfinden und 10101dann ihre Einsen finden, dh zu diesem Ergebnis 01010hinzufügen 1, das heißt 01010+1=01011, was die endgültige Antwort ist.

evaa
quelle
4

Lassen Sie uns die Antwort 10 - 12 in binärer Form mit 8 Bits erhalten: Was wir wirklich tun werden, ist 10 + (-12)

Wir müssen den Komplimentteil von 12 erhalten, um ihn von 10 zu subtrahieren. 12 in binär ist 00001100. 10 in binär ist 00001010.

Um den Komplimentteil von 12 zu erhalten, kehren wir einfach alle Bits um und addieren dann 1. 12 in binär umgekehrt ist 11110011. Dies ist auch der inverse Code (das eigene Komplement). Jetzt müssen wir eine hinzufügen, die jetzt 11110100 ist.

11110100 ist also das Kompliment von 12! Einfach, wenn Sie es so sehen.

Jetzt können Sie die obige Frage von 10 - 12 in binärer Form lösen.

00001010
11110100
-----------------
11111110  
NightSky
quelle
3

2er-Ergänzungen: Wenn wir eine zusätzliche mit den 1er-Ergänzungen einer Zahl hinzufügen, erhalten wir die 2er-Ergänzungen. Beispiel: 100101 Das 1er-Komplement ist 011010 und das 2er-Komplement ist 011010 + 1 = 011011 (durch Hinzufügen eines 1er-Komplements) . Weitere Informationen finden Sie in diesem Artikel grafisch.

Milon
quelle
plus1 für Link, der eine Erklärung mit Kreis hat
Manohar Reddy Poreddy
3

Wenn man das Komplementsystem der beiden aus mathematischer Sicht betrachtet, ist es wirklich sinnvoll. In der Zehner-Ergänzung besteht die Idee darin, den Unterschied im Wesentlichen zu "isolieren".

Beispiel: 63 - 24 = x

Wir fügen die Ergänzung von 24 hinzu, die wirklich nur (100 - 24) ist. Alles, was wir tun, ist 100 auf beiden Seiten der Gleichung zu addieren.

Die Gleichung lautet nun: 100 + 63 - 24 = x + 100, deshalb entfernen wir die 100 (oder 10 oder 1000 oder was auch immer).

Aufgrund der unbequemen Situation, eine Zahl von einer langen Kette von Nullen subtrahieren zu müssen, verwenden wir im Dezimalsystem das Neunerkomplement ein "verringertes Radixkomplement" -System.

Wenn wir eine Zahl sehen, die von einer großen Kette von Neunen abgezogen wird, müssen wir nur die Zahlen umkehren.

Beispiel: 99999 - 03275 = 96724

Das ist der Grund, warum wir nach dem Neuner-Komplement 1 hinzufügen. Wie Sie wahrscheinlich aus der Mathematik der Kindheit wissen, wird 9 durch 'Stehlen' zu 10. Im Grunde genommen ist es also nur das Zehner-Komplement, das 1 aus dem Unterschied nimmt.

In Binary entspricht das Zweierkomplement dem Zehnerkomplement, während das Zweierkomplement dem Neunerkomplement entspricht. Der Hauptunterschied besteht darin, dass wir nicht versuchen, den Unterschied mit Zehnerpotenzen zu isolieren (10, 100 usw. in die Gleichung einfügen), sondern den Unterschied mit Zweierpotenzen zu isolieren.

Aus diesem Grund invertieren wir die Bits. Genau wie unser Minuend eine Kette von Neunern in Dezimalzahl ist, ist unser Minuend eine Kette von Einsen in Binärform.

Beispiel: 111111 - 101001 = 010110

Da Ketten von Einsen 1 unter einer schönen Zweierpotenz liegen, stehlen sie 1 aus der Differenz, wie es Neuner in Dezimalzahlen tun.

Wenn wir negative Binärzahlen verwenden, sagen wir wirklich nur:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Um x zu 'isolieren', müssen wir 1 hinzufügen, da 1111 eins von 10000 entfernt ist, und wir entfernen die führende 1, weil wir sie gerade zum ursprünglichen Unterschied hinzugefügt haben.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Entfernen Sie einfach 10000 von beiden Seiten, um x zu erhalten. Dies ist die grundlegende Algebra.

KyBrooks
quelle
3

Viele der bisherigen Antworten erklären gut, warum das Zweierkomplement zur Darstellung einer negativen Zahl verwendet wird, sagen uns jedoch nicht, was die Zweierkomplementzahl ist, insbesondere nicht, warum eine '1' hinzugefügt wird und tatsächlich oft falsch hinzugefügt wird.

Die Verwirrung ergibt sich aus einem schlechten Verständnis der Definition einer Komplementzahl. Eine Ergänzung ist der fehlende Teil, der etwas vervollständigen würde.

Das Radixkomplement einer n-stelligen Zahl x in Radix b ist per Definition b ^ nx. In Binär wird 4 durch 100 dargestellt, was 3 Ziffern (n = 3) und einen Radix von 2 (b = 2) hat. Sein Radixkomplement ist also b ^ nx = 2 ^ 3-4 = 8-4 = 4 (oder 100 in binär).

Beim binären Erhalten eines Radixkomplements ist es jedoch nicht so einfach, sein verringertes Radixkomplement zu erhalten, das als (b ^ n-1) -y definiert ist, nur 1 weniger als das des Radixkomplements. Um ein verringertes Radix-Komplement zu erhalten, drehen Sie einfach alle Ziffern um.

100 -> 011 (vermindertes Radixkomplement)

Um das Radix-Komplement (zwei) zu erhalten, addieren wir einfach 1 als definierte Definition.

011 +1 -> 100 (Zweierkomplement).

Schauen wir uns nun mit diesem neuen Verständnis das Beispiel von Vincent Ramdhanie an (siehe obige zweite Antwort).

/ * Start von Vincent

1111 in Dezimal umwandeln:

Die Zahl beginnt mit 1, ist also negativ, also finden wir das Komplement von 1111, das 0000 ist. Addieren Sie 1 zu 0000 und erhalten Sie 0001. Konvertieren Sie 0001 in eine Dezimalzahl, die 1 ist. Wenden Sie das Vorzeichen = -1 an. Tada!

Ende von Vincent * /

Sollte verstanden werden als

Die Zahl beginnt mit 1, ist also negativ. Wir wissen also, dass es sich um ein Zweierkomplement mit einem Wert x handelt. Um das x zu finden, das durch das Zweierkomplement dargestellt wird, müssen wir zuerst das Einsenkomplement finden.

Zweierkomplement von x: 1111 Einkomplement von x: 1111-1 -> 1110; x = 0001, (alle Ziffern umdrehen)

Wende das Zeichen - an und die Antwort = -x = -1.

user779764
quelle
3

Das Wort Komplement leitet sich von der Vollständigkeit ab. In der Dezimalwelt stellen die Ziffern 0 bis 9 eine Ergänzung (vollständiger Satz) von Ziffern oder numerischen Symbolen bereit , um alle Dezimalzahlen auszudrücken. In der binären Welt stellen die Ziffern 0 und 1 ein Komplement von Ziffern bereit , um alle binären Zahlen auszudrücken. Tatsächlich müssen die Symbole 0 und 1 verwendet werden, um alles (Text, Bilder usw.) sowie positive (0) und negative (1) darzustellen. In unserer Welt wird das Leerzeichen links von der Zahl als Null betrachtet:

                  35=035=000000035.

In einem Computerspeicherort gibt es kein Leerzeichen. Alle Bits (Binärziffern) müssen entweder 0 oder 1 sein. Zur effizienten Verwendung von Speichernummern können 8-Bit-, 16-Bit-, 32-Bit-, 64-Bit- und 128-Bit-Darstellungen gespeichert werden. Wenn eine als 8-Bit-Nummer gespeicherte Zahl an eine 16-Bit-Stelle übertragen wird, müssen Vorzeichen und Größe (Absolutwert) gleich bleiben. Dies erleichtert sowohl die Komplementdarstellung von 1 als auch die Komplementdarstellung von 2. Als Substantiv: Sowohl das 1er-Komplement als auch das 2er-Komplement sind binäre Darstellungen von vorzeichenbehafteten Größen, wobei das höchstwertige Bit (das linke) das Vorzeichenbit ist. 0 ist für positiv und 1 ist für negativ. 2s Komplement bedeutet nicht negativ. Es bedeutet eine signierte Menge. Wie bei der Dezimalstelle wird die Größe als positive Größe dargestellt. Die Struktur verwendet eine Vorzeichenerweiterung, um die Menge beim Heraufstufen in ein Register [] mit mehr Bits beizubehalten:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Als Verb: 2-Komplement bedeutet negieren . Es bedeutet nicht, negativ zu machen. Es bedeutet, wenn negativ positiv ist; Wenn positiv, negativ. Die Größe ist der absolute Wert:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Diese Fähigkeit ermöglicht eine effiziente binäre Subtraktion durch Negieren und Addieren. a - b = a + (-b)

Der offizielle Weg, das 1-Komplement zu nehmen, besteht darin, für jede Ziffer ihren Wert von 1 zu subtrahieren.

        1'scomp(0101) = 1010.

Dies entspricht dem Umdrehen oder Invertieren jedes Bits einzeln. Dies führt zu einer negativen Null, die nicht sehr beliebt ist, so dass das Problem durch Hinzufügen einer Eins zum Komplement von te 1 beseitigt wird. Um das 2s-Komplement zu negieren oder zu nehmen, nehmen Sie zuerst das 1s-Komplement und addieren Sie dann 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

In den Beispielen funktioniert die Negation auch mit vorzeichenerweiterten Zahlen.

Hinzufügen:
1110 Carry 111110 Carry 0110 entspricht 000110 1111 111111 Summe 0101 Summe 000101

Subtrahieren:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Beachten Sie, dass beim Arbeiten mit dem Zweierkomplement das Leerzeichen links von der Zahl mit Nullen für positive Zahlen gefüllt ist, aber mit Einsen für negative Zahlen. Der Übertrag wird immer hinzugefügt und muss entweder eine 1 oder eine 0 sein.

Prost

Russ
quelle
3

Das Komplement von 2 ist im Wesentlichen eine Möglichkeit, die additive Inverse einer Binärzahl zu finden. Fragen Sie sich Folgendes: Wenn eine Zahl in binärer Form gegeben ist, würde welches Bitmuster, wenn es zur ursprünglichen Zahl hinzugefügt wird, das Ergebnis auf Null setzen? Wenn Sie dieses Bitmuster erstellen können, ist dieses Bitmuster die -ve-Darstellung (additive Inverse) der ursprünglichen Zahl. Wie per Definition sollte das Hinzufügen einer Zahl zu ihrer additiven Umkehrung immer zu Null führen. Beispiel: Nehmen Sie 101, was dezimal 5 ist. Nun besteht die Aufgabe darin, ein Bitmuster zu erstellen, das beim Hinzufügen zu dem angegebenen Bitmuster (101) zu Null führen würde. Beginnen Sie dazu mit dem Bit ganz rechts von 101 und stellen Sie für jedes einzelne Bit erneut dieselbe Frage: Welches Bit sollte ich zu "diesem" Bit hinzufügen, um das Ergebnis auf Null zu setzen? Setzen Sie dies unter Berücksichtigung der üblichen Übertragung fort. Nachdem wir mit den 3 am weitesten rechts stehenden Stellen fertig sind (die Ziffern, die die ursprüngliche Zahl ohne Rücksicht auf die führenden Nullen definieren), geht der letzte Übertrag in das Bitmuster der additiven Inversen. Da wir die ursprüngliche Zahl beispielsweise in einem einzelnen Byte halten könnten, sollten alle anderen führenden Bits in der additiven Inversen ebenfalls 1 sein, damit der Computer die Zahl und ihre additive Inverse unter Verwendung dieses Speichertyps (char) addiert. Das Ergebnis in diesem Zeichen wären alle Nullen.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0
n-mam
quelle
2

Ich mochte Lavinios Antwort, aber das Verschieben von Bits erhöht die Komplexität. Oft gibt es die Wahl zwischen sich bewegenden Bits, während das Vorzeichenbit respektiert wird oder wenn das Vorzeichenbit nicht respektiert wird. Dies ist die Wahl zwischen der Behandlung der Zahlen als vorzeichenbehaftet (-8 bis 7 für ein Halbbyte, -128 bis 127 für Bytes) oder vorzeichenlosen Zahlen mit vollem Bereich (0 bis 15 für Halbbytes, 0 bis 255 für Bytes).

Nosredna
quelle
2

Es ist ein cleveres Mittel, negative Ganzzahlen so zu codieren, dass ungefähr die Hälfte der Kombination von Bits eines Datentyps für negative Ganzzahlen reserviert ist und die Addition der meisten negativen Ganzzahlen mit ihren entsprechenden positiven Ganzzahlen zu einem Übertragsüberlauf führt das Ergebnis bleibt also binär Null.

Wenn also im 2er-Komplement 0x0001 ist, ist -1 0x1111, da dies zu einer kombinierten Summe von 0x0000 (mit einem Überlauf von 1) führt.

Edwin Buck
quelle
1

Ich hatte vor ein paar Wochen das gleiche Problem. Am Ende habe ich online aus verschiedenen Quellen darüber gelesen, versucht, die Teile zusammenzusetzen, und selbst darüber geschrieben, um sicherzugehen, dass ich es richtig verstanden habe. Wir verwenden das Zweierkomplement hauptsächlich aus zwei Gründen:

  1. Um Mehrfachdarstellungen von 0 zu vermeiden
  2. Um zu vermeiden, dass bei einem Überlauf das Übertragsbit (wie im eigenen Komplement) nachverfolgt wird.
  3. Das Ausführen einfacher Operationen wie Addition und Subtraktion wird einfach.

Wenn Sie eine ausführlichere Erklärung der Angelegenheit wünschen, probieren Sie den Artikel aus, den ich hier geschrieben habe . Ich hoffe es hilft!

KN Bhargav
quelle
1

Das Zweierkomplement ist eine der Möglichkeiten, eine negative Zahl auszudrücken, und die meisten Controller und Prozessoren speichern eine negative Zahl in der Zweierkomplementform

Denis Roosevelt
quelle
1
Dies fügt den Informationen, die durch andere Antworten bereitgestellt werden, nichts hinzu.
Adrian Mole
0

REFERENZ: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Ich invertiere alle Bits und füge 1 hinzu. Programmatisch:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;
Charles Thomas
quelle
Sogar Assembler wäre zu hoch. Es muss ein Schema auf Gate-Ebene der Additionslogik angezeigt werden. Mit T-Zyklen. Sie sind algorithmisch korrekt.
McKenzm
0

Das 2er-Komplement einer gegebenen Zahl ist die Nr. bekam durch Addition von 1 mit dem 1er-Komplement der Nr. Angenommen, wir haben eine Binärnummer: 10111001101 Das Komplement von 1 lautet: 01000110010 Das Komplement von 2 lautet: 01000110011

user10862846
quelle
0

Eine Zahl bitweise zu ergänzen bedeutet, alle darin enthaltenen Bits umzudrehen. Um zwei zu ergänzen, drehen wir alle Bits um und fügen eins hinzu.

Unter Verwendung der 2er-Komplementdarstellung für vorzeichenbehaftete Ganzzahlen wenden wir die 2er-Komplementoperation an, um eine positive Zahl in ihr negatives Äquivalent umzuwandeln und umgekehrt. Wenn Sie also Nibbles als Beispiel verwenden, wird 0001(1) zu 1111(-1), und wenn Sie die Operation erneut anwenden, kehren Sie zu zurück 0001.

Das Verhalten der Operation bei Null ist vorteilhaft, wenn eine einzelne Darstellung für Null ohne spezielle Behandlung von positiven und negativen Nullen gegeben wird. 0000ergänzt 1111, was, wenn 1 hinzugefügt wird. läuft über 0000und gibt uns eine Null, anstatt eine positive und eine negative.

Ein Hauptvorteil dieser Darstellung besteht darin, dass die Standardadditionsschaltungen für vorzeichenlose ganze Zahlen korrekte Ergebnisse liefern, wenn sie auf sie angewendet werden. Wenn Sie beispielsweise 1 und -1 in Halbbytes hinzufügen, laufen 0001 + 1111die Bits aus dem Register heraus und bleiben zurück 0000.

Für eine sanfte Einführung haben die wunderbaren Computerphile ein Video zu diesem Thema produziert .

ahcox
quelle
0

In einfachen Worten 2's Complementist eine Möglichkeit, negative Zahlen im Computerspeicher zu speichern. Positive Zahlen werden als normale Binärzahl gespeichert.

Betrachten wir dieses Beispiel:

Computer verwendet Binary Number System, um eine beliebige Zahl darzustellen.

x = 5;

Dies wird dargestellt als 0101.

x = -5;

Wenn der Computer trifft - Zeichen gibt, berechnet er das 2er-Komplement und speichert es. i.e5 = 0101 und das Komplement von 2 ist1011 .

Wichtige Regeln, nach denen der Computer Zahlen verarbeitet, sind:

  1. Wenn das erste Bit ist 1 , muss es eine negativeZahl sein.
  2. Wenn alle Bits außer dem ersten Bit vorhanden sind, handelt 0es sich um eine positive Zahl, da kein -0Zahlensystem vorhanden ist. (1000 is not -0 stattdessen ist sie positiv 8).
  3. Wenn alle Bits sind 0 ist es 0.
  4. Sonst ist es ein positive number.
Raghu
quelle
-6

Die einfachste Antwort:

1111 + 1 = (1) 0000. Also muss 1111 -1 sein. Dann ist -1 + 1 = 0.

Es ist perfekt, das alles für mich zu verstehen.

Dmitry
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Codor
Es ist die Antwort. Das einfachste. Für mich - der Beste.
Dmitry