logo

Zweierkomplement

Es gibt drei verschiedene Möglichkeiten, eine vorzeichenbehaftete Ganzzahl (Artikel) darzustellen. a: Vorzeichenbehaftetes Bit, b: 1er-Komplement und c: 2er-Komplement. Versuchen wir zu verstehen, wie diese Methoden entstanden sind und warum das Zweierkomplement anderen vorgezogen wird.

Wie wir wissen, werden Daten in Bits gespeichert. Wie können wir eine vorzeichenbehaftete Ganzzahl im Speicher speichern? Um dieses Problem zu lösen, entwickeln wir zunächst eine naive Lösung und wiederholen sie dann, bis wir die beste Lösung für unser Problem haben.



a) Vorzeichenbehaftetes Bit

Beim Versuch, eine Ganzzahl mit Vorzeichen zu speichern, scheint es naheliegend, das Bit ganz links für das Vorzeichen zu reservieren und die restlichen Bits zum tatsächlichen Speichern der Werte zu verwenden. Beispiel: Im 4-Bit-System ist das erste Bit von links für das Vorzeichen reserviert (0 steht für positiv, während 1 für negativ steht) und die anderen 3 Bits werden zum Speichern der Werte verwendet. Ebenso wird im 8-Bit-System das erste Bit von links für das Vorzeichen und die restlichen 7 für Werte verwendet.

Herr Nr.

Binäre Darstellung



Dezimalwert

A

0000



+0

B

0001

+1

C

0010

+2

D

0011

+3

So konvertieren Sie eine Ganzzahl in eine Zeichenfolge in Java
UND

0100

+4

F

0101

+5

G

0110

+6

H

0111

+7

ICH

1000

-0

J

1001

-1

K

1010

-2

L

1011

-3

M

1100

-4

N

1101

-5

Ö

1110

-6

P

1111

-7

Mit diesem Ansatz können wir erfolgreich vorzeichenbehaftete Ganzzahlen darstellen. Aber wenn wir es genauer analysieren, konnten wir folgende Nachteile beobachten:

1) Zwei Darstellungen von Null:

Im 4-Bit-System sollten wir 16 (24) Werte speichern können, aber +1 bis +7 und -1 bis -7 sind nur 14 Werte. Wo sind noch zwei Werte? Wenn wir die Tabelle genau betrachten, werden wir feststellen, dass diese beiden Werte gegen 0 konvergieren. Wir haben also zwei Darstellungen von Null, das heißt eine Darstellung für +0 und eine andere für -0.

Aber sind zwei Darstellungen von 0 ein großes Problem? Na und? Statt 16 eindeutigen Werten können wir nur 15 Werte speichern. Wir können es uns leisten, die Reichweite um 1 zu reduzieren, nicht wahr? Für den Softwareentwickler mag das kein Problem sein, aber für einen Schaltungsdesigner könnte es sehr frustrierend sein, zuerst zu prüfen, ob der Wert +0 ist, und dann zu prüfen, ob er -0 ist.

2) Die signierte Erweiterung funktioniert nicht für negative Zahlen:

Die Größe der Daten nimmt rapide zu. Irgendwann müssen wir das Bitsystem erweitern, damit wir den Umfang der speicherbaren Daten vergrößern können. Im Jahr 2014 überschritt das Gangnam-Style-Video das YouTube-Aufruflimit und zwang YouTube, die Aufrufanzahl von 32-Bit auf 64-Bit-Ganzzahl mit Vorzeichen zu erhöhen. Ebenso wird die 32-Bit-Unix-Uhr am 19. Januar 2038 überlaufen, da sie die Zeit in Sekunden in einer 32-Bit-Ganzzahl mit Vorzeichen aufzeichnet.

Daher ist es ebenso wichtig, dass unser Repräsentationssystem leicht erweiterbar ist, was mit diesem Repräsentationssystem nicht möglich ist.

Dezimal

4-Bit

5-Bit

6-Bit

+2

0010

00010

000010

+7

0111

00111

000111

-2

1010

10010 (!= 11010)

100010 (!= 111010)

-7

1111

10111 (!= 11111)

100111 (!= 111111)

3) Die binäre Addition funktioniert nicht:

Versuchen wir, zwei Binärzahlen zu addieren:

Binär

Dezimal

Binär

Dezimal

Binär

Dezimal

Nummer 1

0010

+2

0111

+7

1101

-5

Nummer 2

1010

-2

1010

-2

0011

+3

Binäre Addition

1100

-4

0001

+1

0000

+0

Dezimale Addition

+0

+5

-2

Warum funktioniert eine einfache binäre Addition hier nicht? Der Grund dafür ist, dass das Vorzeichenbit (ganz links) kein gewöhnliches Bit und kein Teil einer tatsächlichen Zahl ist. Stellen Sie sich die Situation vor, in der man die Hardwareschaltung so entwerfen muss, dass das Vorzeichenbit ignoriert wird, um eine Addition durchzuführen und dann das Vorzeichenbit anzuhängen.

Das war also eine naive Art, eine vorzeichenbehaftete Ganzzahl darzustellen. Das Hauptproblem bei diesem Ansatz besteht darin, dass wir negative Zahlen nach unten nach oben abgebildet haben. Wenn wir unser Kartensystem dahingehend ändern, dass sie von oben nach unten erfasst werden, werden einige der oben genannten Probleme gelöst.

b) 1's Co ergänzen

Wenn wir unsere negativen Zahlen von oben nach unten neu zuordnen, erhalten wir die folgende Binärtabelle:

Ja Nein.

Binäre Darstellung

Dezimalwert

1er-Komplement

Signiertes Bit

A

0000

+0

+0

B

0001

+1

+1

C

0010

+2

+2

D

0011

+3

+3

UND

0100

+4

+4

F

0101

+5

char in Integer-Java umwandeln
+5

G

0110

+6

+6

H

0111

+7

+7

ICH

1000

-7

-0

J

1001

-6

-1

K

1010

-5

-2

L

1011

-4

-3

M

1100

-3

-4

N

1101

-2

-5

Ö

1110

-1

-6

P

1111

-0

-7

Wie erhält man eine binäre Darstellung einer Ganzzahl im 1er-Komplementverfahren?

  • Positive Zahlen werden ähnlich wie bei der vorzeichenbehafteten Ganzzahlmethode dargestellt
  • Negative Zahlen werden dargestellt, indem jedes Bit der entsprechenden positiven Zahl invertiert wird (die Invertierung kann einfach durch Verwendung des NOT-Gatters während des Hardware-Designs erfolgen).

Lassen Sie uns dies genau analysieren, um zu sehen, ob wir eine Verbesserung erzielt haben.

1) Zwei Darstellungen von Null:

Auch bei diesem Ansatz haben wir zwei Darstellungen von Null.

2) Die signierte Erweiterung funktioniert nicht für negative Zahlen:

Die vorzeichenbehaftete Erweiterung funktioniert perfekt für negative Zahlen.

Dezimal

4-Bit

5-Bit

6-Bit

+2

0010

00010

000010

+7

0111

00111

000111

-2

1101

11101

111101

-7

1000

11000

111000

3) Die binäre Addition funktioniert mit geänderten Regeln:

Binär

Dezimal

Binär

Dezimal

Binär

Dezimal

Nummer 1

0010

+2

0111

+7

1010

-5

Nummer 2

1101

-2

1101

-2

0011

+3

Binäre Addition

1111

-0

0100

+4

1101

-2

Dezimale Addition

+0

+5

-2

Die Antwort ist nicht immer richtig, aber sie kommt der richtigen Antwort sehr nahe. Wir können dafür sorgen, dass es funktioniert, wenn wir die Regel befolgen Wenn Sie einen Übertrag auf Ihrem ganz linken Bit generiert haben, dann werfen Sie ihn nicht weg, sondern bringen Sie ihn zurück und fügen Sie ihn dem ganz rechten Bit hinzu.

Binär

Dezimal

Binär

Dezimal

Binär

Dezimal

Nummer 1

0111

+7

1110

-1

0111

+7

Nummer 2

1101

-2

1001

-6

1011

-4

Binäre Addition

(1) 0100

+4

(1) 0111

+7

(1) 0010

+2

Hinzufügen eines Vorwärts-Rücktrags

0101

+5

1000

-7

0011

+3

Auf jeden Fall ist die 1er-Komplementmethode besser als das vorzeichenbehaftete Bit. Unsere größten Bedenken sind gelöst, aber das Problem bleibt (zwei Darstellungen der Null) und unser Hack in der binären Addition liefert Hinweise zur Verbesserung der Einserkomplementmethode. Lassen Sie uns diese Sätze umformulieren, um es einfacher zu machen.

  • Wir haben eine zusätzliche Darstellung von Null, die unnötig ist
  • Wenn wir bei der Addition zweier Binärzahlen einen Übertrag im äußersten linken Bit haben, müssen wir +1 zum Ergebnis addieren, d. h. die richtige Antwort kann durch Durchlaufen nach unten zur nächsten Zeile in der Binärtabelle gefunden werden.

Beide weisen uns darauf hin, dass eine zusätzliche Darstellung von Null die Hauptursache des Problems ist. Entfernen wir also diese zusätzliche Null und verschieben wir alle negativen Werte in die nächste Zeile (-7 wird von I -> J verschoben, -6 wird von J -> K verschoben und so weiter ...)

c) 2er-Komplement

Wenn wir -0 aus der 1er-Komplementtabelle entfernen und alle negativen Werte eine Zeile nach unten verschieben, erhalten wir die folgende Tabelle, die 2er-Komplement genannt wird:

Ja Nein.

Binäre Darstellung

Dezimalwert

2er-Komplement

1er-Komplement

Signiertes Bit

A

0000

+0

+0

+0

B

0001

+1

+1

+1

Java-String enthält
C

0010

+2

+2

+2

D

0011

+3

+3

+3

UND

0100

+4

+4

+4

F

0101

+5

+5

+5

G

0110

+6

+6

+6

H

0111

+7

+7

+7

ICH

1000

-8

-7

-0

J

1001

-7

= Umkehrung von 7 + 1-Bit

-6

-1

K

1010

-6

= Umkehrung von 6 + 1-Bit

-5

-2

L

1011

-5

= Umkehrung von 5 + 1-Bit

-4

-3

M

1100

-4

= Umkehrung von 4 + 1-Bit

-3

-4

N

1101

-3

= Umkehrung von 3 + 1-Bit

-2

-5

Ö

1110

-2

= Umkehrung von 2 + 1-Bit

-1

-6

P

1111

-1

= Umkehrung von 1 + 1-Bit

-0

-7

Wie erhält man eine binäre Darstellung einer ganzen Zahl im Zweierkomplementverfahren?

  • Positive Zahlen werden ähnlich wie bei der vorzeichenbehafteten Ganzzahlmethode dargestellt
  • Negative Zahlen werden dargestellt, indem jedes Bit der entsprechenden positiven Zahl invertiert und dann 1 Bit hinzugefügt wird

1) Eine Darstellung von Null:

Jetzt haben wir nur noch eine Darstellung von Null und sie ermöglicht uns das Speichern insgesamt 16 eindeutige Werte (+0 bis +7 und -1 bis -8).

2) Vorzeichenbehaftete Erweiterung funktioniert für negative Zahlen:

Die vorzeichenbehaftete Erweiterung funktioniert perfekt für negative Zahlen.

Dezimal

4-Bit

5-Bit

6-Bit

+2

0010

00010

000010

+7

0111

00111

000111

-2

1110

11110

111110

-7

1001

11001

111001

3) Binäre Addition:

Binär

Dezimal

Binär

Dezimal

Binär

Dezimal

Binär

Dezimal

Nummer 1

0010

+2

0111

+7

1011

-5

1111

-1

Nummer 2

1110

-2

1110

-2

0011

+3

1010

-6

Antwort

0000

+0

0101

+5

1110

-2

1001

-7

4) Das erste Bit ist ein vorzeichenbehaftetes Bit:

Das 2er-Komplement hat die schöne Eigenschaft, dass das erste Bit ein Vorzeichenbit ist, da alles Positive mit 0 beginnt, während alles Negative mit 1 beginnt.

5) Speicherüberlaufprüfung:

Bei der Ergänzung haben wir sichergestellt, dass unsere Antwort innerhalb des Bereichs liegt, beim Entwerfen der Hardware muss jedoch ein Speicherüberlauf erkannt werden. Für Hardware-Designer wäre es eine sehr schlechte Idee, die Größe zu überprüfen, um einen Überlauf abzufangen. Die Komplementmethode von 2 bietet eine sehr einfache Möglichkeit, einen Speicherüberlauf zu erkennen. ICH Wenn der Übertrag des vorzeichenbehafteten Bits nicht mit dem Übertrag des vorzeichenbehafteten Bits übereinstimmt, liegt ein Speicherüberlauf vor Das heißt, wenn der Übertrag im vorzeichenbehafteten Bit 0 ist, der Übertrag jedoch 1, oder wenn der Übertrag im Eingang 1, der Übertrag jedoch 0 ist, liegt ein Speicherüberlauf vor.

Binär

Dezimal

Binär

Dezimal

Binär

Dezimal

Binär

Java kehrt einen String um
Dezimal

Nummer 1

1011

-5

0010

2

0111

+7

1011

-5

Nummer 2

1100

-4

0110

6

1110

-2

0011

3

Zusatz

(1) 0111

(0)1000

(1)0101

(0)1110

Tragen Sie das Bit zum Signieren ein

0

Überlauf

1

Überlauf

1

NEIN

0

NEIN

ausführen, um Bit zu signieren

1

0

1

0