it-swarm.com.de

Was ist "2's Complement"?

Ich bin in einem Computersystem-Kurs und habe kämpfend teilweise mit Two's Complement . Ich möchte es verstehen, aber alles, was ich gelesen habe, hat mir das Bild nicht gebracht. Ich habe den Wikipedia-Artikel und verschiedene andere Artikel gelesen, darunter mein Lehrbuch .

Daher wollte ich diesen community wiki -Posten starten, um zu definieren, was Two's Complement ist, wie es zu verwenden ist und wie es Zahlen während Operationen wie Casts (von signierten zu unsignierten und umgekehrt), bitweisen Operationen und beeinflusst Bit-Shift-Operationen.

Was ich hoffe, ist eine klare und prägnante Definition, die von einem Programmierer leicht verstanden werden kann.

382
Frank V

Die Zweierkomplementierung ist eine clevere Methode zum Speichern von Ganzzahlen, sodass gängige mathematische Probleme sehr einfach zu implementieren sind.

Um zu verstehen, müssen Sie an die Zahlen in binärer Zahl denken.

Es sagt im Grunde,

  • für Null verwenden Sie alle Nullen.
  • für positive ganze Zahlen mit maximal 2 zählen(Anzahl Bits - 1)-1.
  • für negative ganze Zahlen genau das Gleiche tun, aber die Rolle von 0 und 1 wechseln (beginnen Sie also nicht mit 0000, sondern 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 - eins
  • 0010 - zwei
  • 0011 - drei
  • 0100 bis 0111 - vier bis sieben

Das ist so weit, wie wir Positives erreichen können. 23-1 = 7.

Für negative:

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

Beachten Sie, dass Sie einen zusätzlichen Wert für Negative (1000 = -8) erhalten, den Sie nicht für Positive verwenden. Dies liegt daran, dass 0000 für Null verwendet wird. Dies kann als Number Line von Computern betrachtet werden.

Unterscheidung zwischen positiven und negativen Zahlen

Dabei erhält das erste Bit die Rolle des "sign" -Bits, da es zur Unterscheidung zwischen positiven und negativen Dezimalwerten verwendet werden kann. Wenn das höchstwertige Bit 1 ist, kann die Binärzahl als negativ bezeichnet werden. Wenn das höchstwertige Bit (ganz links) 0 ist, können Sie sagen, der Dezimalwert ist positiv.

Negative Zahlen "eines Komplimentes" drehen nur das Vorzeichenbit und zählen dann von 0. Aber dieser Ansatz muss mit der Interpretation von 1000 als "negative Null" umgehen, was verwirrend ist. In der Regel müssen Sie sich nur darum kümmern, wenn Sie in der Nähe der Hardware arbeiten.

561
lavinio

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

Das grundlegende Problem, das Sie mit der Zweierkomplementdarstellung zu lösen versuchen, ist das Problem der Speicherung 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 keine Hinweise darauf gibt, ob sie negativ oder positiv sind.

Zeichenstärke und Überschussnotation

Um negative Zahlen zu speichern, können Sie verschiedene Dinge ausprobieren. Zunächst können Sie die Vorzeichenbetragsnotation verwenden, die das erste Bit als Vorzeichenbit zur Darstellung von +/- und die verbleibenden Bits zur Darstellung der Größe verwendet. Also wieder 4 Bits verwenden und davon ausgehen, dass 1 bedeutet - und 0 bedeutet + dann haben Sie 

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

Sie sehen 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, sind sehr komplex.

Was ist 

0010
1001 +
----

?

Ein anderes System ist Überschreibungsnotation . Sie können negative Zahlen speichern, Sie werden das Problem der zwei Nullen los, aber Addition und Subtraktion bleiben schwierig.

So kommt das Zwei-Komplement dazu. Jetzt können Sie positive und negative Ganzzahlen speichern und mit relativ einfacher Arithmetik durchführen. Es gibt eine Reihe von Methoden, um eine Zahl in ein Zweierkomplement umzuwandeln. Hier ist eins.

Konvertieren Sie Dezimal in Zweierkomplement

  1. Wandeln Sie die Zahl in eine Binärdatei um (ignorieren Sie das Vorzeichen vorerst) Z. 5 ist 0101 und -5 ist 0101

  2. Wenn die Zahl eine positive Zahl ist, sind Sie fertig .. _. 5 ist 0101 in binärer Form mit Zweierkomplementnotation.

  3. Wenn die Zahl dann negativ ist

    3.1 Finden Sie das Komplement (invertieren Sie 0 und 1) z.B. -5 ist 0101, also ist das Komplement 1010

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

Was wäre, wenn Sie 2 + (-3) im Binärmodus ausführen wollten? 2 + (-3) ist -1 . Was müssten Sie tun, wenn Sie die Vorzeichengröße verwenden, um diese Zahlen hinzuzufügen? 0010 + 1101 =?

Verwenden Sie das Zweierkomplement, wie einfach es wäre.

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

Konvertierung von Zwei in Dezimalzahl

1111 in Dezimalzahl umrechnen:

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

  2. Addiere 1 zu 0000 und wir erhalten 0001.

  3. Wandle 0001 in dezimal um, das heißt 1.

  4. Wenden Sie das Zeichen = -1 an.

Tada!

304

Wie die meisten Erklärungen, die ich gesehen habe, ist auch in den obigen Erklärungen klar, wie man mit dem Zweierkomplement arbeitet, aber erklären Sie nicht wirklich, was sie sind mathematisch sind. Ich werde versuchen, dies zumindest für ganze Zahlen zu tun, und ich werde einige Hintergründe behandeln, die wahrscheinlich zuerst bekannt sind.

Denken Sie daran, wie es für Dezimal funktioniert:
2345
ist eine Schreibweise
2 × 103 + × 102 + 4 × 101 + 5 × 10.

Auf die gleiche Weise ist Binär ein Weg, Zahlen zu schreiben, indem nur und 1 verwendet werden, wobei die obigen 10er durch 2er ersetzt werden. Dann in binärer,
1111
ist eine Schreibweise
1 × 23 + 1 × 22 + 1 × 21 + 1 × 2
und wenn Sie es herausfinden, ergibt sich 15 (Basis 10). Das liegt daran, dass es so ist
8 + 4 + 2 + 1 = 15.

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

Für Computer erweist es sich als effizienter, a ergänzen Darstellung für negative Zahlen. 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 kann eine unendliche Anzahl von Stellen sein, die berücksichtigt werden müssen.

Glücklicherweise repräsentieren Computer keine Unendlichkeit. Zahlen sind auf eine bestimmte Länge (oder Breite, wenn Sie es vorziehen) beschränkt. Kehren wir also zu positiven Binärzahlen mit einer bestimmten Größe zurück. Ich werde für diese Beispiele 8 Stellen ("Bits") verwenden. Also wäre unsere Binärzahl wirklich
001111
oder
× 27 + × 26 + × 25 + × 24 + 1 × 23 + 1 × 22 + 1 × 21 + 1 × 2

Um das negative Zweierkomplement zu bilden, ergänzen wir zuerst alle (binären) Ziffern, um zu bilden
111100
und addiere 1 zu form
11110001
aber wie sollen wir das verstehen, um -15 zu bedeuten?

Die Antwort ist, dass wir die Bedeutung des höherwertigen Bits (das ganz links stehende) ändern. Dieses Bit ist ein 1 für alle negativen Zahlen. Die Änderung wird darin bestehen, das Vorzeichen seines Beitrags zum Wert der Zahl zu ändern, in der er erscheint. Nun wird also verstanden, dass unser 11110001 repräsentiert
-1 × 27 + 1 × 26 + 1 × 25 + 1 × 24 + × 23 + 0 × 22 + × 21 + 1 × 2
Beachten Sie, dass "-" vor diesem Ausdruck steht? Dies bedeutet, dass das Vorzeichenbit das Gewicht -2 trägt7das ist -128 (Basis 10). Alle anderen Positionen behalten das gleiche Gewicht bei, das sie in vorzeichenlosen Binärzahlen hatten.

Unsere -15 herausarbeiten, ist es
-128 + 64 + 32 + 16 + 1
Probieren Sie es mit Ihrem Taschenrechner aus. es ist -15.

Von den drei Hauptmethoden, mit denen ich negative Zahlen in Computern gesehen habe, gewinnt das 2er-Komplement zweifellos die Bequemlichkeit im allgemeinen Gebrauch. Es hat jedoch eine Kuriosität. 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 überall sonst. Die entsprechende positive Zahl würde nicht in die Anzahl der verwendeten Bits passen.

Noch seltsamer an dieser Zahl ist, dass Sie dieselbe negative Zahl zurückerhalten, wenn Sie versuchen, das Positive zu bilden, indem Sie eine ergänzen und hinzufügen. 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.

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

112
ForDummies

Die Zweierkomplementierung ist sehr nützlich, um den Wert eines Binärwerts zu ermitteln. Ich dachte jedoch an eine viel prägnantere Lösung, um ein solches Problem zu lösen (ich habe noch nie jemanden dies veröffentlicht):

nehmen Sie zum Beispiel eine Binärdatei: 1101, die [ist, vorausgesetzt, Leerzeichen "1" ist das Vorzeichen] gleich -3

mit dem 2er-Komplement würden wir dies tun ... Flip 1101 auf 0010 ... addiere 0001 + 0010 ===> ergibt 0011. 0011 in positiver Binärzahl = 3. daher 1101 = -3

Was mir klar wurde:

anstatt all das Flipping und Addieren auszuführen, können Sie einfach die grundlegende Methode für das Auflösen einer positiven Binärdatei (sagen wir 0101) ausführen (23 * 0) + (22 * 1) + (21 * 0) + (2 * 1) = 5. 

Machen Sie dasselbe Konzept mit einem Negativ! (Mit einer kleinen Drehung)

nehmen Sie zum Beispiel 1101:

für die erste Zahl statt 23 * 1 = 8 , do - (23 * 1) = -8 .

fahren Sie dann wie gewohnt fort, indem Sie -8 + (22 * 1) + (21 * 0) + (2 * 1) = -3

18
Simon Yundov

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

00
01
02
..

Irgendwann wirst du ü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 zur Vereinfachung an, dass jede Zahl über 50 negativ ist. "0" bis "49" steht für 0 bis 49. "99" ist -1, "98" ist -2, ... "50" ist -50.

Diese Darstellung ist Zehnerstelle . Computer verwenden normalerweise Zweierkomplement , was dasselbe ist, außer dass Bits anstelle von Ziffern verwendet werden.

Das Schöne an Zehnern ist, dass der Zusatz einfach funktioniert. Sie müssen nichts Besonderes tun, um positive und negative Zahlen hinzuzufügen.

13

Zwei Komplemente werden durch Addition von 1 zu 1 Komplement der angegebenen Zahl herausgefunden. Lasst uns sagen, dass wir zwei Komplemente von 10101 herausfinden müssen, und dann deren Komplement finden, dh 01010 add 1 zu diesem Ergebnis , 01010+1=01011, das ist die endgültige Antwort.

5
evaa

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 das Kompliment von 12 bekommen, um es von 10 abzunehmen. 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ärem umgekehrten Code ist 11110011. Dies ist auch der Inverse-Code (Komplement) jetzt 11110100.

11110100 ist also ein Kompliment von 12! Einfach, wenn Sie so denken.

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

00001010
11110100
-----------------
11111110  
4
NightSkyCode

Wenn man das Zwei-Komplement-System aus mathematischer Sicht betrachtet, ist es wirklich sinnvoll. In der Zehnergä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. Wir fügen also auf beiden Seiten der Gleichung nur 100 hinzu.

Jetzt lautet die Gleichung: 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 ein System mit verringertem Radix-Komplement, im Dezimalsystem das Neun-Komplement.

Wenn uns eine Zahl präsentiert wird, die von einer großen Neunenkette abgezogen wird, müssen wir nur die Zahlen umkehren.

Beispiel: 99999 - 03275 = 96724

Aus diesem Grund fügen wir nach neun Komplimenten 1 hinzu. Wie Sie wahrscheinlich aus der Kindheitsmathematik wissen, wird 9 durch 'Stehlen' 1. Im Grunde ist es also nur Zehnerkomplement, das den Unterschied ausmacht.

In Binary entspricht das Zweierkomplement dem Zehnerkomplement, das andere Neunergänzungsmittel. Der Hauptunterschied besteht darin, dass wir nicht versuchen, den Unterschied mit Zehnerpotenzen zu isolieren (10, 100 usw. in die Gleichung einzufügen), sondern den Unterschied mit Zehnerpotenzen zu isolieren.

Aus diesem Grund invertieren wir die Bits. So wie unser Minuend eine Dezimenkette ist, so ist unser Minuend eine Binärkette.

Beispiel: 111111 - 101001 = 010110

Da die Ein-Ketten-Zahl 1 unter der Nizza-Potenz von Zwei liegt, "stehlen" sie die Differenz von 1, wie Neun es im Dezimalbereich tut.

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

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000-0101 = x + 1111

Um x 'zu isolieren', müssen wir 1 hinzufügen, da 1111 eine von 10000 ist und wir die führende 1 entfernen, weil wir sie dem 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, es ist grundlegende Algebra.

3
KyBrooks

Viele der bisherigen Antworten erklären sehr gut, warum das Zweierkomplement verwendet wird, um eine negative Zahl darzustellen, erklären jedoch nicht, was die Zweierkomplementzahl ist, insbesondere nicht, warum eine '1' hinzugefügt wird und oft falsch hinzugefügt wird.

Die Verwirrung beruht auf einem schlechten Verständnis der Definition einer Komplementzahl. Eine Ergänzung ist der fehlende Teil, der etwas komplett machen würde. 

Das Radix-Komplement einer n-stelligen Zahl x in Radix b ist definitionsgemäß b ^ n-x. In binär ist 4 durch 100 dargestellt, die 3 Ziffern (n = 3) und eine Basis von 2 (b = 2) hat. Sein Radix-Komplement ist also b ^ n-x = 2 ^ 3-4 = 8-4 = 4 (oder 100 in binär). 

Beim binären Erhalten eines Radix-Komplements ist es jedoch nicht so einfach wie das reduzierte Radix-Komplement, das als (b ^ n-1) -y definiert wird, nur 1 weniger als das eines Radix-Komplements. Um ein reduziertes Radix-Komplement zu erhalten, drehen Sie einfach alle Ziffern.

100 -> 011 (vermindertes Radix-Komplement)

um das Radix-Zweierkomplement zu erhalten, fügen Sie einfach 1 als definierte Definition hinzu.

011 +1 -> 100 (Zweierkomplement).

Lassen Sie uns nun mit diesem neuen Verständnis das Beispiel von Vincent Ramdhanie (siehe zweite Antwort oben) betrachten.

/ * Start von Vincent

1111 in Dezimalzahl umrechnen:

Die Zahl beginnt mit 1, ist also negativ, also finden wir das Komplement von 1111 (0000 . Addieren Sie 1 zu 0000) und erhalten Sie 0001 . Konvertieren Sie 0001 in Dezimalzahl (1 ..__). Verwenden Sie das Zeichen = -1 . Tada!

ende von Vincent * /

Sollte als verstanden werden

Die Zahl beginnt mit 1, ist also negativ. Wir wissen also, dass es sich um einen Zweierkomplement von x handelt. Um das x durch sein Zweierkomplement zu finden, müssen wir zuerst das 1er-Komplement finden.

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

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

3
user779764

Ergänzungen für 2: Wenn wir eine zusätzliche Zahl mit den 1-Ergänzungen einer Zahl hinzufügen, erhalten wir die 2-Ergänzungen. Beispiel: 100101 1-Komplement ist 011010 und 2-Komplement ist 011010 + 1 = 011011 (Durch Hinzufügen eines 1-Komplements) Weitere Informationen In diesem Artikel wird es grafisch erläutert.

2
Milon

Es ist eine clevere Methode, negative ganze Zahlen so zu codieren, dass ungefähr die Hälfte der Bitkombination eines Datentyps für negative ganze Zahlen reserviert ist und die Addition der meisten negativen ganzen Zahlen mit ihren entsprechenden positiven ganzen Zahlen zu einem Überlauf führt Damit bleibt das Ergebnis binär Null.

Im Zweierkomplement, wenn eins 0x0001 ist, ist -1 also 0x1111, da dies eine kombinierte Summe von 0x0000 ergibt (mit einem Überlauf von 1).

2
Edwin Buck

Ich lese eine fantastische Erklärung über Reddit von jng und verwende den Kilometerzähler als Analogie. 

enter image description here

Es ist eine nützliche Konvention. Dieselben Schaltungen und Logikoperationen wie positive Zahlen in binär addieren/subtrahieren, wirkt sich auf beide positive .__ aus. und negative Zahlen, wenn die Konvention verwendet wird, deshalb ist es so nützlich und allgegenwärtig.

Stellen Sie sich den Kilometerzähler eines Autos vor, es rollt bei (sagen wir) 99999. Wenn Sie Inkrement 00000 erhalten Sie 00001. Wenn Sie 00000 dekrementieren, erhalten Sie 99999 (aufgrund der roll-around). Wenn Sie eins zu 99999 hinzufügen, geht es zurück zu 00000. Es ist daher nützlich zu entscheiden, dass 99999 -1 darstellt. Ebenso ist es sehr nützlich zu entscheiden, dass 99998 -2 und so weiter darstellt. Du hast irgendwo zu stoppen, und auch die obere Hälfte der Zahlen. gelten als negativ (50000-99999) und die untere Hälfte positiv Stehen Sie einfach für sich (00000-49999). Als Ergebnis wird die oberste Ziffer 5-9 bedeutet, dass die dargestellte Zahl negativ ist und 0-4 .__ ist. bedeutet, dass das Dargestellte positiv ist - genau wie das oberste Bit Zeichen in einer Zweierkomplement-Binärzahl.

Das zu verstehen war auch für mich schwierig. Einmal bekam ich es und ging zurück zu Lesen Sie die Artikel und Erklärungen der Bücher erneut durch (damals gab es kein Internet .__). es verstehen. Ich habe ein Buch geschrieben, in dem ich nach .__ das (was sich seit 10 Jahren recht gut verkauft hat).

1
Alister Norris

Ich hatte vor ein paar Wochen das gleiche Problem. Am Ende las ich aus verschiedenen Quellen online darüber, versuchte, die Teile zusammenzusetzen, und schrieb selbst darüber, um sicherzustellen, dass ich es richtig verstanden habe. Wir verwenden Zweierkomplement aus zwei Gründen: 

  1. Um mehrere Darstellungen von 0 zu vermeiden
  2. Um zu vermeiden, das Übertragsbit (wie in einem Komplement) im Falle eines Überlaufs zu verfolgen.
  3. Das Ausführen einfacher Operationen wie Addition und Subtraktion wird einfach.

Wenn Sie eine detailliertere Erklärung der Angelegenheit wünschen, versuchen Sie den von mir geschriebenen Artikel hier . Ich hoffe es hilft!

1
K.N. Bhargav

Ich mochte die Antwort von Lavinio, aber das Verschieben von Bits erhöht die Komplexität. Oft gibt es die Wahl, Bits zu verschieben, während das Vorzeichenbit respektiert wird oder das Vorzeichenbit nicht beachtet 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 vollwertigen vorzeichenlosen Nummern (0 bis 15 für Halbbytes, 0 bis 255 für Byte).

1
Nosredna

Die Wortergänzung ergibt sich aus der Vollständigkeit. In der Dezimalwelt stellen die Ziffern 0 bis 9 ein Komplement (vollständiger Satz) von Ziffern oder numerischen Symbolen dar, um alle Dezimalzahlen auszudrücken. In der binären Welt liefern die Ziffern 0 und 1 ein Komplement von Ziffern, 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 Computer-Speicherort ist kein Leerzeichen vorhanden. Alle Bits (Binärziffern) müssen entweder 0 oder 1 sein. Um Speichernummern effizient zu nutzen, können sie als 8-Bit-, 16-Bit-, 32-Bit-, 64-Bit- und 128-Bit-Darstellung gespeichert werden. Wenn eine Zahl, die als 8-Bit-Zahl gespeichert ist, an eine 16-Bit-Stelle übertragen wird, müssen Vorzeichen und Betrag (absoluter Wert) gleich bleiben. Dies wird durch die Komplementdarstellung von 1 und 2 erleichtert. Als Nomen: Sowohl das 1-Komplement als auch das 2-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 unterschriebene Menge. Wie bei der Dezimalzahl wird die Größe als positive Größe dargestellt. Die Struktur verwendet die Vorzeichenerweiterung, um die Menge zu erhalten, wenn in ein Register [] mit mehr Bits gewechselt wird:

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

Als Verb: 2s Komplement bedeutet negieren . Es bedeutet nicht, negativ zu machen. Es bedeutet, wenn negativ positiv machen; wenn positiv, mach 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 unter Verwendung von Negieren und Addieren. a - b = a + (-b)

Die offizielle Methode, das 1-Komplement zu berechnen, besteht darin, für jede Ziffer ihren Wert von 1 zu subtrahieren.

        1'scomp(0101) = 1010.

Dies ist dasselbe wie das Umkehren oder Invertieren jedes einzelnen Bits. Dies führt zu einer negativen Null, die nicht sehr beliebt ist. Wenn Sie also eine Eins zum Komplement von 1 hinzufügen, wird das Problem beseitigt. Um das 2er-Komplement zu negieren oder zu nehmen, nimm zuerst das 1er-Komplement und addiere 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 ist dasselbe wie 000110 1111 111111 Summe 0101 Summe 000101

ABZUG:

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

Beachten Sie, dass bei der Arbeit mit dem Zweierkomplement das Leerzeichen links von der Zahl für positive Zahlen mit Nullen gefüllt ist, für negative Zahlen jedoch mit Einsen. Der Übertrag wird immer addiert und muss entweder 1 oder 0 sein.

Prost

1
Russ

Um eine Zahl bitweise zu ergänzen, müssen Sie alle Bits darin umdrehen. Um zwei zu ergänzen, drehen wir alle Bits um und fügen eines hinzu.

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

Das Verhalten der Operation bei Null ist vorteilhaft, wenn eine einzige Darstellung für Null ohne spezielle Behandlung von positiven und negativen Nullen angegeben wird. 0000 ergänzt 1111, das bei der Hinzufügung von 1 hinzugefügt wird. überläuft zu 0000 und gibt uns eine Null statt einer positiven und einer negativen. 

Ein entscheidender Vorteil dieser Darstellung ist, dass die Standardadditionsschaltungen für vorzeichenlose Ganzzahlen korrekte Ergebnisse liefern, wenn sie auf sie angewendet werden. Wenn Sie zum Beispiel 1 und -1 in Nibbles hinzufügen: 0001 + 1111, laufen die Bits aus dem Register heraus und lassen 0000 zurück. 

Für eine sanfte Einführung haben die wunderbaren Computerphile ein Video zum Thema erstellt.

0
ahcox

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

Ich invertiere alle Bits und addiere 1. Programmgesteuert:

  // 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;
0
Charles Thomas

Das 2-Komplement ist im Wesentlichen ein Weg, die additive Inverse einer Binärzahl zu finden. Fragen Sie sich Folgendes: Wenn Sie eine Zahl in binärer Form angeben, würde welches Bitmuster, wenn es zu der ursprünglichen Zahl hinzugefügt wird, das Ergebnis zu Null machen? Wenn Sie dieses Bitmuster erstellen können, ist dieses Bitmuster die -ve-Darstellung (additive Inverse) der ursprünglichen Zahl. Per Definition sollte das Hinzufügen einer Zahl zu ihrer additiven Umkehrung immer zu Null führen. Beispiel: nimm 101, was dezimal 5 ist. Die Aufgabe besteht nun darin, ein Bitmuster zu erstellen, das, wenn es zu dem gegebenen Bitmuster (101) hinzugefügt wird, Null ergibt. Beginnen Sie dazu mit dem am weitesten rechts stehenden Bit von 101 und stellen Sie für jedes einzelne Bit erneut die gleiche Frage: Welches Bit sollte ich zu "diesem" Bit hinzufügen, um das Ergebnis auf Null zu setzen? Machen Sie dies unter Berücksichtigung der üblichen Übertragungen weiter. Nachdem wir mit den 3 am weitesten rechts stehenden Stellen fertig sind (die Ziffern, die die ursprüngliche Zahl ohne Berücksichtigung der führenden Nullen definieren), wird der letzte Übertrag in das Bitmuster der additiven Umkehrung geschrieben. Da wir die ursprüngliche Zahl in einem einzelnen Byte festhalten könnten, sollten alle anderen führenden Bits in der additiven Umkehrung ebenfalls 1 sein, so dass, wenn der Computer die Zahl und ihre additive Umkehrung unter Verwendung dieses Speichertyps (char) hinzufügt, Das Ergebnis in diesem Zeichen wären alle Nullen.

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

Zweierkomplement einer gegebenen Zahl ist die Nr. erhalten durch Addition von 1 mit dem 1-Komplement der Nr. _. Nehmen wir an, wir haben eine binäre Nr .: 10111001101 Das 1-Komplement lautet: 01000110010 Das 2-Komplement lautet: 01000110011

0
user10862846