Zweierkomplement: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „mini|Das Zweierkomplement für dreistellige Zahlen als Zahlenkreis dargestellt Das Zweierkomplement ist eine Möglichkeit, negative Zahlen binär darzustellen ohne dafür ein besonderes Vorzeichen wie + oder - zu benötigen. Mithilfe des Zweierkomplements können nicht nur negative Zahlen beschrieben werden, sondern damit kann auch die Subtraktion als Addition umgesetzt werden, was den Aufbau von […“) |
Sn (Diskussion | Beiträge) |
||
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
Das [[Zweierkomplement]] ist eine Möglichkeit, negative Zahlen [[Binärsystem|binär]] darzustellen ohne dafür ein besonderes Vorzeichen wie + oder - zu benötigen. Mithilfe des Zweierkomplements können nicht nur negative Zahlen beschrieben werden, sondern damit kann auch die Subtraktion als Addition umgesetzt werden, was den Aufbau von [[Von-Neumann-Rechner|Rechenwerken]] erheblich vereinfacht. | Das [[Zweierkomplement]] ist eine Möglichkeit, negative Zahlen [[Binärsystem|binär]] darzustellen ohne dafür ein besonderes Vorzeichen wie + oder - zu benötigen. Mithilfe des Zweierkomplements können nicht nur negative Zahlen beschrieben werden, sondern damit kann auch die Subtraktion als Addition umgesetzt werden, was den Aufbau von [[Von-Neumann-Rechner|Rechenwerken]] erheblich vereinfacht. | ||
Die Grundidee ist, dass man für alle Zahlen eine feste Länge annimmt und das erste Bit als Vorzeichenbit betrachtet. Üblicherweise wird 0 als positives und 1 als negatives Vorzeichen verwendet. | == Mathematische Grundlage == | ||
Die Grundidee ist, dass man für alle Zahlen eine '''feste Länge''' annimmt und das '''erste Bit als Vorzeichenbit''' betrachtet. Üblicherweise wird 0 als positives und 1 als negatives Vorzeichen verwendet. | |||
Bei 4 Bit langen Zahlen ist also <math>0111 = 7</math> die größte positive Zahl und die Zahlen <math>1000, 1001, \dots, 1111</math> sind negativ, wobei <math>1000 = -8</math> und <math>1111 = -1</math>. Warum das so ist, wird im Folgenden erklärt: | Bei 4 Bit langen Zahlen ist also <math>0111 = 7</math> die größte positive Zahl und die Zahlen <math>1000, 1001, \dots, 1111</math> sind negativ, wobei <math>1000 = -8</math> und <math>1111 = -1</math>. Warum das so ist, wird im Folgenden erklärt: | ||
Um | Nehmen wir die Zahl <math>1111 (= -1)</math>. Wenn wir zu dieser Zahl 1 hinzuaddieren würde, erhielten wir das Ergebnis <math>1111 + 1 = \color{gray}1\color{black}0000</math>. Da wir eine feste Länge von 4 Bits für unsere Zahlen gesetzt haben, fällt die führende 1 weg und als Ergebnis bleibt <math>0000 = 0</math> übrig – genau das Ergebnis, das wir uns wünschen. | ||
Um diese Eigenschaft für alle negativen Zahlen zu erhalten, müssen darum die negativen Zahlen von <math>1000 = -8</math> bis <math>1111 = -1</math> wachsen. | |||
Um das Vorzeichen einer beliebigen Zahl zu ändern (egal, ob von <math>+</math> nach <math>-</math> oder umgekehrt) nehme man die Zahl, invertiere alle Bits (aus 0en werden 1en und umgekehrt) und addiere dann 1<ref>Wenn man nicht 1 addiert, kann man zwar immer noch jeder positiven Zahl ein negatives Gegenstück zuweisen und umgekehrt, aber dann gibt es zwei Darstellungen für die 0, nämlich <math>0000</math> und <math>1111</math> und das bringt wieder neue Probleme mit sich.</ref>. | |||
{{Beispiel|1= | {{Beispiel|1= | ||
Wir bleiben bei 4 Bit langen Zahlen | Wir bleiben bei 4 Bit langen Zahlen und nehmen <math>0101 = 5</math> als Beispiel. Diese <math>0101</math> wird nun wie folgt in ihr negatives Gegenstück umgewandelt: | ||
# | # Invertiere alle Bits: <math>0101 \rightarrow 1010</math> | ||
# | # Addiere 1: <math>1010 + 1 = 1011</math> | ||
Die Zweierkomplement-Darstellung von <math>-5</math> ist also <math>1011</math> | Die Zweierkomplement-Darstellung von <math>-5</math> ist also <math>1011</math> | ||
}} | }} | ||
Zeile 16: | Zeile 22: | ||
Allgemein können mit <math>n</math> Bits die Zahlen von <math>-2^{n-1}</math> bis <math>2^{n-1}-1</math> dargestellt werden. | Allgemein können mit <math>n</math> Bits die Zahlen von <math>-2^{n-1}</math> bis <math>2^{n-1}-1</math> dargestellt werden. | ||
In modernen Computern werden typischerweise 32 oder 64 Bit als ''Wortlänge'' verwendet. Beim Programmieren hängt die Wortlänge oft vom verwendeten [[Datentyp]] ab. Zum Beispiel ist der Datentyp <code>int</code> für Ganzzahlen typischerweise 32 Bit lang. Wenn 1 Bit für das Vorzeichen reserviert ist, bleiben noch 31 Bits für die eigentliche Zahl übrig. Die größte Zahl, die man mit einem <code>int</code> darstellen kann, ist also <math>2^{ | == Vorteile dieser Darstellung == | ||
Die Darstellung von negativen Zahlen mit dem Zweierkomplement bietet viele Vorteile. Mithilfe des Vorzeichenbits kann extrem schnell geprüft werden, ob eine Zahl positiv oder negativ ist. Auch die Information, ob eine Zahl gerade oder ungerade ist, bleibt am letzten Bit erkennbar. Nicht zuletzt kann das Zweierkomplement genutzt werden, um die Subtraktion von zwei binären Zahlen als Addition umzusetzen. Auf diese Weise können [[Prozessor|Prozessoren]] einfacher gestaltet werden und müssen weniger unterschiedliche Anweisungen ausführen können. | |||
== Auswirkungen beim Programmieren == | |||
In modernen Computern werden typischerweise 32 oder 64 Bit als ''Wortlänge'' verwendet. Beim Programmieren hängt die Wortlänge oft vom verwendeten [[Datentyp]] ab. Zum Beispiel ist der Datentyp <code>int</code> für Ganzzahlen typischerweise 32 Bit lang. Wenn 1 Bit für das Vorzeichen reserviert ist, bleiben noch 31 Bits für die eigentliche Zahl übrig. Die größte Zahl, die man mit einem <code>int</code> darstellen kann, ist also <math>2^{32-1}-1 = 2147483647</math>. Was passieren kann, wenn man zu dieser Zahl 1 hinzuzuaddieren versucht, zeigen die beiden folgenden Abbildungen: | |||
<gallery mode="nolines" perrow="2" widths="400" heights="300" caption="Das oben abgebildete Programm ist in [[C (Programmiersprache)|C]] geschrieben und addiert zum größtmöglichen Integerwert 1 hinzu. In dem [[Eingabeaufforderung|Terminal]] unten ist die Ausgabe des Programms zu sehen."> | |||
Datei:C integer overflow decimal.png|2147483647 + 1 = -2147483648?! | Datei:C integer overflow decimal.png|2147483647 + 1 = -2147483648?! | ||
Datei:C integer overflow binary.png|In der Binärdarstellung lässt sich leichter nachvollziehen, was da passiert. | Datei:C integer overflow binary.png|In der Binärdarstellung lässt sich leichter nachvollziehen, was da passiert. | ||
</gallery>Manche Programmiersprachen wie C produzieren bei derartigen Rechenoperationen keine Fehlermeldung oder Warnung. In anderen Sprachen wie [[JavaScript]] wird | </gallery> | ||
Manche Programmiersprachen wie C produzieren bei derartigen Rechenoperationen keine Fehlermeldung oder Warnung. In anderen Sprachen wie [[JavaScript]] wird {{JavaScript|Infinity}} als Ergebnis ausgegeben, wenn Zahlen zu groß werden. In wieder anderen Sprachen wie [[Python (Programmiersprache)|Python]] gibt es so gut wie keine Einschränkungen für die Größe von Zahlen. | |||
== Weblinks == | == Weblinks == |
Aktuelle Version vom 28. September 2024, 13:07 Uhr
Das Zweierkomplement ist eine Möglichkeit, negative Zahlen binär darzustellen ohne dafür ein besonderes Vorzeichen wie + oder - zu benötigen. Mithilfe des Zweierkomplements können nicht nur negative Zahlen beschrieben werden, sondern damit kann auch die Subtraktion als Addition umgesetzt werden, was den Aufbau von Rechenwerken erheblich vereinfacht.
Mathematische Grundlage
Die Grundidee ist, dass man für alle Zahlen eine feste Länge annimmt und das erste Bit als Vorzeichenbit betrachtet. Üblicherweise wird 0 als positives und 1 als negatives Vorzeichen verwendet.
Bei 4 Bit langen Zahlen ist also die größte positive Zahl und die Zahlen sind negativ, wobei und . Warum das so ist, wird im Folgenden erklärt:
Nehmen wir die Zahl . Wenn wir zu dieser Zahl 1 hinzuaddieren würde, erhielten wir das Ergebnis . Da wir eine feste Länge von 4 Bits für unsere Zahlen gesetzt haben, fällt die führende 1 weg und als Ergebnis bleibt übrig – genau das Ergebnis, das wir uns wünschen.
Um diese Eigenschaft für alle negativen Zahlen zu erhalten, müssen darum die negativen Zahlen von bis wachsen.
Um das Vorzeichen einer beliebigen Zahl zu ändern (egal, ob von nach oder umgekehrt) nehme man die Zahl, invertiere alle Bits (aus 0en werden 1en und umgekehrt) und addiere dann 1[1].
Wir bleiben bei 4 Bit langen Zahlen und nehmen als Beispiel. Diese wird nun wie folgt in ihr negatives Gegenstück umgewandelt:
- Invertiere alle Bits:
- Addiere 1:
Die Zweierkomplement-Darstellung von ist also
Allgemein können mit Bits die Zahlen von bis dargestellt werden.
Vorteile dieser Darstellung
Die Darstellung von negativen Zahlen mit dem Zweierkomplement bietet viele Vorteile. Mithilfe des Vorzeichenbits kann extrem schnell geprüft werden, ob eine Zahl positiv oder negativ ist. Auch die Information, ob eine Zahl gerade oder ungerade ist, bleibt am letzten Bit erkennbar. Nicht zuletzt kann das Zweierkomplement genutzt werden, um die Subtraktion von zwei binären Zahlen als Addition umzusetzen. Auf diese Weise können Prozessoren einfacher gestaltet werden und müssen weniger unterschiedliche Anweisungen ausführen können.
Auswirkungen beim Programmieren
In modernen Computern werden typischerweise 32 oder 64 Bit als Wortlänge verwendet. Beim Programmieren hängt die Wortlänge oft vom verwendeten Datentyp ab. Zum Beispiel ist der Datentyp int
für Ganzzahlen typischerweise 32 Bit lang. Wenn 1 Bit für das Vorzeichen reserviert ist, bleiben noch 31 Bits für die eigentliche Zahl übrig. Die größte Zahl, die man mit einem int
darstellen kann, ist also . Was passieren kann, wenn man zu dieser Zahl 1 hinzuzuaddieren versucht, zeigen die beiden folgenden Abbildungen:
Manche Programmiersprachen wie C produzieren bei derartigen Rechenoperationen keine Fehlermeldung oder Warnung. In anderen Sprachen wie JavaScript wird Infinity
als Ergebnis ausgegeben, wenn Zahlen zu groß werden. In wieder anderen Sprachen wie Python gibt es so gut wie keine Einschränkungen für die Größe von Zahlen.
Weblinks
Fußnoten
- ↑ Wenn man nicht 1 addiert, kann man zwar immer noch jeder positiven Zahl ein negatives Gegenstück zuweisen und umgekehrt, aber dann gibt es zwei Darstellungen für die 0, nämlich und und das bringt wieder neue Probleme mit sich.