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.