Dies geschieht so, dass für die Addition keine spezielle Logik für den Umgang mit negativen Zahlen erforderlich ist. Lesen Sie den Artikel auf Wikipedia .
Angenommen, Sie haben zwei Zahlen, 2 und -1. In Ihrer „intuitiven“ Art und Weise Zahlen repräsentieren, würden sie sein 0010
und 1001
jeweils (Ich bin auf 4 Bits für die Größe kleben). In der Art und Weise, wie sich die beiden ergänzen , sind sie 0010
und 1111
. Nehmen wir an, ich möchte sie hinzufügen.
Die Zweierkomplementaddition ist sehr einfach. Sie fügen normalerweise Zahlen hinzu und jedes Übertragsbit am Ende wird verworfen. Sie werden also wie folgt hinzugefügt:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001
ist 1, was das erwartete Ergebnis von "2 + (- 1)" ist.
Bei Ihrer "intuitiven" Methode ist das Hinzufügen jedoch komplizierter:
0010
+ 1001
= 1011
Welches ist -3, richtig? Einfaches Hinzufügen funktioniert in diesem Fall nicht. Sie müssen beachten, dass eine der Zahlen negativ ist, und in diesem Fall einen anderen Algorithmus verwenden.
Bei dieser "intuitiven" Speichermethode ist die Subtraktion eine andere Operation als die Addition und erfordert zusätzliche Überprüfungen der Zahlen, bevor sie hinzugefügt werden können. Da die grundlegendsten Operationen (Addition, Subtraktion usw.) so schnell wie möglich sein sollen, müssen Sie Zahlen so speichern, dass Sie die einfachsten möglichen Algorithmen verwenden können.
Zusätzlich gibt es bei der "intuitiven" Speichermethode zwei Nullen:
0000 "zero"
1000 "negative zero"
Die intuitiv die gleiche Nummer haben, aber beim Speichern zwei unterschiedliche Werte haben. Jede Anwendung muss zusätzliche Schritte ausführen, um sicherzustellen, dass Werte ungleich Null auch keine negative Null sind.
Es gibt einen weiteren Bonus beim Speichern von Ints auf diese Weise, und dann müssen Sie die Breite des Registers erweitern, in dem der Wert gespeichert wird. Mit dem Zweierkomplement ist das Speichern einer 4-Bit-Zahl in einem 8-Bit-Register eine Frage der Wiederholung höchstwertiges Bit:
0001 (one, in four bits)
00000001 (one, in eight bits)
1110 (negative two, in four bits)
11111110 (negative two, in eight bits)
Es geht nur darum, das Vorzeichen des kleineren Wortes zu betrachten und es zu wiederholen, bis es die Breite des größeren Wortes auffüllt.
Bei Ihrer Methode müssten Sie das vorhandene Bit löschen. Dies ist eine zusätzliche Operation zusätzlich zum Auffüllen:
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 diese zusätzlichen 4 Bits in beiden Fällen noch setzen, aber im "intuitiven" Fall müssen Sie auch das 5. Bit löschen. Dies ist ein winziger zusätzlicher Schritt in einer der grundlegendsten und häufigsten Operationen, die in jeder Anwendung vorhanden sind.