Frage

Ich bin nur neugierig, wenn es einen Grund gibt, warum, um darzustellen -1 in binär, Zweierkomplement verwendet wird: die Bits Spiegeln und Zugabe von 1

-1 wird von 11111111 (Zweier-Komplement) dargestellt und nicht (ich intuitivere) 10000001, die binären 1 mit dem ersten Bit als Negativ-Flag ist.

Disclaimer: Ich verlasse nicht auf binäre Arithmetik für meinen Job

War es hilfreich?

Lösung

Es ist vollbracht, so dass zusätzlich braucht nicht für den Umgang mit negativen Zahlen eine besondere Logik haben. Schauen Sie sich Artikel auf Wikipedia .

Angenommen, Sie zwei Zahlen, 2 und -1. In Ihrem „intuitive“ Art und Weise Zahlen repräsentieren, würden sie 0010 und 1001 werden, bzw. (ich bin auf 4 Bits für die Größe kleben). In der Ergänzung Art und Weise die beiden, sie sind 0010 und 1111. Nun lassen Sie uns sagen, ich will, um sie hinzuzufügen.

Zwei-Komplement-Zusatz ist sehr einfach. Sie fügen Zahlen normal und jede Übertragsbit am Ende verworfen. Also sind sie wie folgt hinzugefügt:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 ist 1, was ist das erwartete Ergebnis von "2 + (- 1)".

Aber in Ihrem "intuitiven" Verfahren, das Hinzufügen ist komplizierter:

  0010
+ 1001
= 1011

Welche ist -3, nicht wahr? Einfache hinaus funktioniert nicht in diesem Fall. Sie müssen beachten, dass eine der Zahlen negativ ist und einen anderen Algorithmus zu verwenden, wenn das der Fall ist.

Für diese „intuitive“ Speichermethode, Subtraktion ist eine andere Operation als hinaus erfordern zusätzliche Kontrollen auf den Zahlen, bevor sie hinzugefügt werden können. Da Sie die grundlegenden Operationen (Addition, Subtraktion, etc.) sein, so schnell wie möglich wollen, müssen Sie Zahlen in einer Art und Weise speichern, die Sie die einfachsten Algorithmen möglich nutzen können.

Zusätzlich wird in der „intuitiven“ Speichermethode gibt es zwei Nullen:

0000  "zero"
1000  "negative zero"

Welche intuitiv die gleiche Zahl sind aber zwei verschiedene Werte, wenn gespeichert. Jede Anwendung müssen zusätzliche Maßnahmen ergreifen, um sicherzustellen, dass Nicht-Null-Werte sind auch nicht negativ Null.

Es gibt einen weiteren Bonus mit ints auf diese Weise zu speichern, und das ist, wenn Sie die Breite des Registers um den Wert verlängern müssen, ist in gespeichert werden. Mit Zweierkomplement, ein 4-Bit-Zahl in einem 8-Bit-Register zu speichern ist eine Frage die höchstwertigen Bits zu wiederholen:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Es ist nur eine Frage der auf dem Vorzeichenbit des kleineren Wortes suchen und zu wiederholen, bis sie die Breite des größeren Wortes Pads.

Mit Ihrer Methode würden Sie müssen die vorhandene Bit löschen, die zusätzlich zur Polsterung eine zusätzliche Operation ist:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Sie müssen noch diese zusätzlichen 4 Bits in beiden Fällen setzen, sondern in dem „intuitiven“ Fall müssen Sie auch das fünfte Bit löschen. Es ist ein winziges Extraschritt in eines der wichtigsten und gemeinsamen Operationen in jeder Anwendung.

Andere Tipps

Wikipedia sagt alles:

  

Das Zweierkomplement-System hat den Vorteil, nicht erforderlich ist, dass die Addition und Subtraktion Schaltung, um die Vorzeichen der Operanden zu untersuchen, um zu bestimmen, ob zu addieren oder zu subtrahieren. Diese Eigenschaft macht das System sowohl einfacher zu implementieren und in der Lage leicht höhere Genauigkeit arithmetische Handhabung. Auch Null hat nur eine einzige Darstellung, Vermeidung der mit negativen Null zugeordnet Feinheiten, die in ones'-Komplement-Systemen vorhanden ist.

Mit anderen Worten, das Hinzufügen ist das gleiche, ob oder nicht die Zahl negativ ist.

Auch wenn diese Frage alt ist, lassen Sie mich in meinem 2 Cent setzen.

Bevor ich das erklären, kann zurück zu den Wurzeln bekommen. 2' Ergänzung 1-Komplement + 1. Was ist nun 1-Komplement und was ist seine Bedeutung zusätzlich.

Summe aller n-Bit-Zahl und die 1-Komplement gibt Ihnen die höchstmögliche Zahl, die von den n-Bits dargestellt werden kann. Beispiel:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Nun, was passiert, wenn wir versuchen, 1 mehr auf das Ergebnis hinzuzufügen. Es wird zu einem Überlauf.

Das Ergebnis wird sein, welche 1 0000 0 ist (wie wir es mit 4-Bit-Zahlen arbeiten, (die 1 auf der linken Seite ist ein Überlauf)

So

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Jemand entschied sich dann 1en anrufen Komplement + 1 als 2-er- Komplement. So ist die obige Aussage wird: Jede n'bit Nummer + sein 2-Komplement = 0 was bedeutet, 2er- Komplement einer Zahl = - (diese Zahl)

All dies ergibt eine weitere Frage, warum können wir nur die (n-1) der n Bits zu repräsentieren positive Zahl verwenden und warum ist der am weitesten links stehende n-te Bit repräsentiert Zeichen (0 auf den linken Bit Mittel + ve-Nummer, und 1 bedeutet, & ndash; ve-Nummer). zB warum verwenden wir nur die ersten 31 Bits eines int in Java positive Zahl darzustellen, wenn das 32. Bit ist 1, es ist eine -ve-Nummer.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (das Ergebnis Null ist, mit dem Übertrag 1 überquell)

Damit das System von (n + 2-er- Komplement von n) = 0, funktioniert immer noch. Die einzige Mehrdeutigkeit hier ist 2er- Komplement von 12 ist 0100, die zweideutig stellt auch +8, andere als repräsentierte -12 in 2s Komplementsystems.

Dieses Problem wird gelöst werden, wenn positive Zahlen immer eine 0 in ihrem linken Bit haben. In diesem Fall ergänzt ihre 2s wird immer ein 1 in ihrer am weitesten links stehenden Bit, und wir gewohnt haben die Zweideutigkeit des gleichen Satzes von Bits, die ein 2-Komplement-Zahl repräsentiert, sowie eine + Anzahl ve.

Zwei-Komplement Addition und Subtraktion kann in gewohnter Weise durchgeführt werden (wie Sie Wund für Zahlen ohne Vorzeichen). Es verhindert auch, -0 (eine separate Art und Weise 0 darzustellen, die gleich nicht mit den normalen Bit-für-Bit-Verfahren zum Vergleichen Zahl auf 0 wäre).

Dies ist Summen und Differenzen von Zahlen zu vereinfachen. eine Summe von einer negativen Zahl und einem positiven in 2er-Komplementen kodifiziert ist das gleiche wie sie oben in der normalen Art und Weise summiert werden.

Die übliche Ausführung der Operation ist „die Bits Flip und fügen 1“, aber es gibt einen anderen Weg, es zu definieren, die wahrscheinlich der Grund klarer macht. 2-Komplement ist das Formular, das Sie erhalten, wenn Sie die übliche unsigned Darstellung nehmen, wobei jedes Bit die nächste Potenz von 2 steuert, und nur der bedeutendste Begriff negativ machen.

Aufnahme eines 8-Bit-Wert a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Die übliche unsigned binäre Interpretation ist:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 64 + 128 + 32 + 16 + 8 + 4 + 2 + 1 = 255

Die Ergänzung Interpretation der beiden ist:
-2 7 a * 7 + 2 6 a * 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = + 64 + -128 32 + 16 + 8 + 4 + 2 + 1 = -1

Keiner der anderen Bits ändern sich überhaupt bedeutet, und trägt zu einer 7 ist „Überlauf“ und wahrscheinlich nicht funktionieren, so ziemlich alle der arithmetischen Operationen ohne Änderungen arbeiten (wie andere haben vermerkt). Registrieren Sie Größe im Allgemeinen das Vorzeichenbit inspizieren und andere Logik verwenden.

Zwei-Komplement kann negative und positive Zahlen ohne spezielle Logik zusammenaddiert werden.

Wenn Sie versucht haben 1 hinzuzufügen und -1 Ihre Methode
mit  10000001 (-1)
+00000001 (1)
Sie erhalten
 10000010 (-2)

Stattdessen durch Zweier-Komplement, können wir hinzufügen

11111111 (-1)
+00000001 (1) Sie erhalten
 00000000 (0)

Das gleiche gilt für die Subtraktion.

Auch wenn Sie versuchen 4 subtrahieren von 6 (zwei positiven Zahlen) können Sie 2-Komplement-4 und fügen die beide zusammen 6 + (-4) = 6-4 = 2

Das bedeutet, dass Subtraktion und Addition von sowohl positiven als auch negativen Zahlen können alle durch die gleiche Schaltung in der CPU durchgeführt werden.

Um auf andere Antworten zu erweitern:

In Zweier-Komplement

  • Hinzufügen ist der gleiche Mechanismus wie schlicht positive ganze Zahlen addieren.
  • subtrahierend nicht ändern
  • Multiplikation auch!

Abteilung einen anderen Mechanismus erforderlich ist.

Alle diese sind wahr, weil Zweier-Komplement nur normale modulare Arithmetik ist, wo wir durch Subtraktion der Modulo einiger Zahlen als negativ zu betrachten wählen.

, um die Antworten auf diese Frage lesen, ich auf diesen Kommentar kam [editiert].

  

2-Komplement von 0100 (4) wird 1100. Jetzt 1100 12 ist, wenn ich normalerweise sagen. Damit,   wenn ich normal sagen 1100, dann ist es 12, aber wenn ich sage, 2-Komplement 1100 dann   es ist -4? Auch in Java, wenn 1100 (können jetzt 4 Bits annehmen) gespeichert wird dann   wie wird bestimmt, ob es 12 oder -4 ist ?? - hagrawal 2. Juli um 16:53 Uhr

Meiner Meinung nach ist die Frage in diesem Kommentar gefragt ist recht interessant und so würde ich zunächst mag es neu zu formulieren und dann eine Antwort zu geben und ein Beispiel.

Frage - wie kann das System bestimmen, wie ein oder mehrere hat benachbartes Bytes zu interpretieren? Insbesondere kann, wie das System festzustellen, ob eine gegebene Folge von Bytes ist eine einfache Binärzahl oder ein Komplement Nummer 2?

ANTWORT - Das System legt fest, wie eine Folge von Bytes durch Typen zu interpretieren. Typen definieren

  • , wie viele Bytes in Betracht gezogen werden
  • , wie dieser Bytes interpretiert werden

Beispiel - Im Folgenden gehen wir davon aus, dass

  • char das sind 1 Byte lang
  • short sind 2 Bytes lang
  • int ist und float die sind 4 Byte lang

Bitte beachten Sie, dass diese Größen zu meinem System spezifisch sind. Obwohl ziemlich häufig, sie können von System zu System unterschiedlich sein. Wenn Sie neugierig sind, was sie auf Ihrem System sind, verwenden Sie die sizeof Operator .

Zu allererst definieren wir ein Array 4 Bytes enthalten, und alle von ihnen auf die Binärzahl 10111101 initialisieren, zu der Hexadezimalzahl BD entspricht.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Dann lesen wir die Array Inhalte mit verschiedenen Typen.

unsigned char und signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short und short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, int und float

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

Die 4 Bytes im RAM (l_Just4Bytes[ 0..3 ]) bleiben immer genau das gleiche. Das einzige, was sich ändert, ist, wie wir sie interpretieren.

Auch hier wir sagen, das System wie interpretieren sie durch Typen .

Zum Beispiel oben haben wir die folgenden Arten verwendet, um die Inhalte des l_Just4Bytes Array zu interpretieren

  • unsigned char: 1 Byte im Klar binär
  • signed char: 1 Byte im 2er- Komplement
  • unsigned short: 2 Byte im Klar binärer Schreibweise
  • short: 2 Byte im 2er- Komplement
  • unsigned int: 4 Byte im Klar binärer Schreibweise
  • int: 4 Byte im 2er- Komplement
  • float: 4 Byte in IEEE 754 mit einfacher Genauigkeit Notation

[EDIT] Dieser Beitrag wurde bereits nach dem Kommentar von user4581301 bearbeitet. Vielen Dank für die Zeit nehmen, diese paar hilfreichen Linien fallen zu lassen!

Sie können Professor Jerry Cain von der Stanford sehen das Zweierkomplement zu erklären, in der zweiten Vorlesung (die Erklärung des 2er-Komplement bezüglich beginnt um 13.00 Uhr) in der Vortragsreihe Programmierparadigmen zur Verfügung genannt von Standford YouTube-Kanal zu sehen. Hier ist der Link zu der Vortragsreihe: http://www.youtube.com/view_play_list?p= 9D558D49CA734A02 .

Zwei-Komplement verwendet, weil es einfacher ist in der Schaltung zu implementieren und auch eine negative Null nicht zulässt.

Wenn x Bits, Zweier-Komplement wird von + Bereich (2 ^ x / 2 + 1) bis - (2 ^ x / 2). Einerkomplement wird von + laufen gelassen (2 ^ x / 2) bis -. (2 ^ x / 2), jedoch wird eine negative Null gestatten (0000 ist gleich 1000 in ein 4-Bit-1-Komplement-System)

Nun, das ist Ihre Absicht nicht wirklich alle Bits Ihrer Binärzahl umzukehren. Es ist eigentlich jeder seine Stelle subtrahieren von 1. Es ist nur ein glücklicher Zufall, dass in 0 1 von 1 Ergebnissen subtrahiert und in 1. So spiegeln die Bits 0 von 1 Ergebnissen Subtrahieren effektiv diese Subtraktion durchgeführt wird.

Aber warum sind Sie finden jeden Unterschied der Ziffer von 1? Nun, du bist nicht. Ihre eigentliche Absicht ist, die gegebene binäre Zahl der Differenz aus einer anderen binären Zahl zu berechnen, das die gleiche Anzahl von Ziffern hat, enthält aber nur 1 ist. Zum Beispiel, wenn Ihre Nummer 10110001, wenn Sie alle diese Bits kippen, sind Sie effektiv zu berechnen. (11111111 - 10110001)

Dies erklärt den ersten Schritt bei der Berechnung der Zweierkomplement. Nun wollen wir schließen den zweiten Schritt - die Zugabe von 1 -. Auch im Bild

1 die obigen binäre Gleichung:

11111111 bis 10110001 + 1

Was bekommen Sie? Dies:

100000000 bis 10110001

Dies ist die letzte Gleichung. Und durch diese beiden Schritte durchgeführt werden Sie versuchen, diese, Enddifferenz zu finden. Die binäre Zahl subtrahiert von einer anderen Binärzahl mit einer zusätzlichen Ziffer und die Nullen enthalten, außer an der meisten Bedeutung Bit-Position

Aber warum sind wir hankerin nach diesem wirklich Unterschied? Nun, von hier an, ich denke, es wäre besser, wenn Sie die Wikipedia-Artikel lesen .

Wir führen nur Additionsoperation sowohl für Addition und Subtraktion. Wir fügen den zweiten Operanden auf den ersten Operanden für die Addition. Für Subtraktion fügen wir das 2er-Komplement des zweiten Operanden auf den ersten Operanden.

Mit einer Komplement Darstellung 2 wir digitale Komponenten für die Subtraktion-only Addierer und Komplementierer verwendet werden keine separaten müssen.

Es lohnt sich, dass auf einigen frühen Rechenmaschinen zu beachten, vor den Tagen der digitalen Computern, würde Subtraktion, indem der Bediener ausgeführt werden Werte eingeben auf jeder Taste eine andere farbige Reihe von Legenden mit (so würde jeder Schlüssel eingeben neun minus Nummer abgezogen werden), und eine spezielle Taste drücken würde einen Übertrag in eine Berechnung annehmen würde. Somit wird auf einer sechsstelligen Maschine, 1234 von einem Wert zu subtrahieren, würde der Bediener Tasten treffen, die normalerweise „998765“ ein und drücken eine Taste anzeigen würde diesen Wert plus eins für die Berechnung im Gange hinzuzufügen. Zwei-Komplement-Arithmetik ist einfach das binäre Äquivalent der früheren „ten's-Komplement“ Arithmetik.

Der Vorteil Subtraktion durch das Komplement Verfahren zur Durchführung ist Reduzierung der Hardware
complexity.The sind keine Notwendigkeit der verschiedenen digitalen Schaltung für die Addition und subtraction.both  Addition und Subtraktion werden nur durch Addierer durchgeführt.

Ein großer Vorteil der Zweierkomplement-Darstellung, die noch nicht hier erwähnt worden ist, dass die unteren Bits eines Zweierkomplement-Summe, Differenz oder produktabhängig sind nur auf dem entsprechenden Bits die Operanden. Der Grund dafür, dass der 8-Bit-Wert mit Vorzeichen für -1 11111111 ist, dass Subtrahieren jeder ganze Zahl, deren untersten 8 Bits aus irgendeiner anderen ganzen Zahl, deren untersten 8 Bits 00000001 sind 0000000 wird eine ganze Zahl ergeben, deren untersten 8 Bits 11111111. Mathematisch wäre der Wert -1 eine unendliche Folge von 1en, aber alle Werte innerhalb des Bereichs eines bestimmten Integer-Typ entweder werden alle 1 oder alle 0 über einen bestimmten Punkt, so dass es bequem ist für Computer „Vorzeichen erweitern“ die höchstwertigen Bits einer Zahl, als ob es repräsentiert eine unendliche Zahl von 1 oder 0.

Zweierkomplement-ist nur über die nur angemeldete Zahlendarstellung, die gut funktioniert, wenn sie mit Typen größer als eine binären Maschine natürliche Wortgröße zu tun, da, wenn eine Addition oder Subtraktion durchgeführt wird, Code, um die niedrigsten Chunk jede Operandenholeinheit kann, berechnet die niedrigste chunk des Ergebnisses, und zu speichern, die dann das nächste Stück von jedem Operanden laden, um die nächste chunk des Ergebnisses zu berechnen und zu speichern, die usw. Somit können selbst ein Prozessor, der alle Additionen und Subtraktionen erforderlich, durch eine einziges 8 gehen Bit-Register kann 32-Bit-Zahlen mit Vorzeichen Griff ziemlich effizient (langsamer als mit einem 32-Bit-Registern, natürlich, aber immer noch bearbeitbar).

Wenn der C-Standard erlaubt mit den anderen unterzeichneten Darstellungen, könnte jedes Bit des Ergebnisses möglicherweise durch jedes Bit der Operanden beeinflusst wird, ist es notwendig zu machen entweder hält einen ganzen Wert in Register auf einmal oder auch Berechnungen folgen mit einem zusätzlichen Schritt, würde, zumindest in einigen Fällen erfordern das Lesen, Modifizieren und Umschreiben jede Chunk des Ergebnisses.

Eine befriedigende Antwort, warum Two2 des Complement verwendet wird negative Zahlen eher als Einerkomplement System darzustellen ist, dass                         Zweierkomplement-System löst das Problem der mehr Darstellungen von 0 und die Notwendigkeit für Ende-around-trägt , die in dem Komplementsystem One existieren von dem für negative Zahlen.

Für weitere Informationen besuchen Sie https://en.wikipedia.org/wiki/Signed_number_representations

Für End-around-Carry-Besuch https://en.wikipedia.org/wiki/End-around_carry

, weil CPU-Hersteller sind faul!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top