Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m114:learningunits:lu01:binaereganzzahlen [2025/02/06 13:37] – [Binär codierte Ganzzahlen] kmaurizi | modul:m114:learningunits:lu01:binaereganzzahlen [2025/02/27 09:45] (aktuell) – kmaurizi | ||
|---|---|---|---|
| Zeile 14: | Zeile 14: | ||
| Diese Codierung wird unter anderem für Variablen vom Typ '' | Diese Codierung wird unter anderem für Variablen vom Typ '' | ||
| Die Zahlen werden einfach im binären Zahlensystem (siehe auch [[modul: | Die Zahlen werden einfach im binären Zahlensystem (siehe auch [[modul: | ||
| - | Auf das Speichern und Verarbeiten von Brüchen wird bewusst verzichtet. Die binär codierten Ganzzahlen können nicht bloss positive Zahlen darstellen, sondern haben den Wertebereich der [[https:// | + | Auf das Speichern und Verarbeiten von Brüchen wird bewusst verzichtet. Die binär codierten Ganzzahlen können nicht bloss positive Zahlen darstellen, sondern haben den Wertebereich der [[https:// |
| + | * Wenn das vorderste Bit '' | ||
| + | * Ist es '' | ||
| + | |||
| + | ==== Zahlenkreis statt Zahlenstrahl ==== | ||
| + | |||
| + | In der Mathematik stellen wir Zahlen häufig auf einem unendlichen Zahlenstrahl dar, der in beide Richtungen fortläuft. In der Informatik hingegen arbeiten wir mit einer festgelegten Anzahl von Bits zur Darstellung von Ganzzahlen. Dadurch ist der Wertebereich endlich und es entsteht kein linearer Zahlenstrahl, | ||
| + | |||
| + | Wenn beispielsweise ein 8-Bit-Datentyp wie '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Dieses kreisförmige Modell erklärt, warum bei binär codierten Ganzzahlen herkömmliche Konzepte wie ein unendlicher Zahlenstrahl nicht mehr sinnvoll sind. Alle arithmetischen Operationen müssen den Wrap-around-Effekt berücksichtigen, | ||
| ==== Positive Zahlen ==== | ==== Positive Zahlen ==== | ||
| Im Speicher sind alle Zahlen als binäre Codes abgelegt. | Im Speicher sind alle Zahlen als binäre Codes abgelegt. | ||
| Um diesen binären Code als Dezimalzahl zu lesen, übertragen Sie den Wert einfach ins 10er System. | Um diesen binären Code als Dezimalzahl zu lesen, übertragen Sie den Wert einfach ins 10er System. | ||
| - | 1011 0010< | + | 0011 0010< |
| Wie das geht, erfahren Sie im Kapitel [[modul: | Wie das geht, erfahren Sie im Kapitel [[modul: | ||
| Zeile 27: | Zeile 39: | ||
| //Siehe auch [[http:// | //Siehe auch [[http:// | ||
| - | In der Informatik wird für binäre Ganzzahlen das Zweierkomplement verwendet. | + | In der Informatik wird für negative |
| Mit dieser Technik können Rechenoperationen ohne spezielle Regeln für positive und negative Zahlen eingesetzt werden. | Mit dieser Technik können Rechenoperationen ohne spezielle Regeln für positive und negative Zahlen eingesetzt werden. | ||
| Mehr dazu erfahren Sie im Kapitel [[modul: | Mehr dazu erfahren Sie im Kapitel [[modul: | ||
| - | Für positive Zahlen | + | Für positive Zahlen: Im Zweierkomplement |
| Für negative Zahlen gehen Sie wie folgt vor: | Für negative Zahlen gehen Sie wie folgt vor: | ||
| Zeile 48: | Zeile 60: | ||
| - Subtrahieren Sie 1 von der Zahl: -12< | - Subtrahieren Sie 1 von der Zahl: -12< | ||
| - | == Umwandlung ins Zweierkomplement von Hand == | + | === Umwandlung ins Zweierkomplement von Hand === |
| + | <WRAP center round tip 60%> | ||
| + | Trick zur schnelleren Umwandlung (einer negativen in eine positive Binärzahl oder umgekehrt) von Hand: Von rechts angefangen, alle Nullen und die erste Eins abschreiben und alle nachfolgenden Stellen invertieren. | ||
| + | </ | ||
| Dieser Programmablaufplan zeigt, wie Sie das Zweierkomplement einer binären Zahl ohne zu rechnen erhalten. | Dieser Programmablaufplan zeigt, wie Sie das Zweierkomplement einer binären Zahl ohne zu rechnen erhalten. | ||
| Dies stellt eine Alternative zum oben beschriebenen Vorgehen dar: | Dies stellt eine Alternative zum oben beschriebenen Vorgehen dar: | ||
| Zeile 54: | Zeile 70: | ||
| {{: | {{: | ||
| - | === Wieso kein Vorzeichen? === | ||
| - | Auf den ersten Blick scheint die Lösung mit dem Zweierkomplement umständlich. | ||
| - | Wäre es nicht einfacher, das erste Bit als Vorzeichen zu verwenden? | ||
| - | Zum Beispiel: Das erste Bit ist ... | ||
| - | * ' | ||
| - | * ' | ||
| - | Zum Speichern der Zahlen ist diese Lösung problemlos. | ||
| - | Weniger als 1 Bit um das Vorzeichen darzustellen, | ||
| - | |||
| - | Wie sieht es aber beim Rechnen mit diesen Zahlen aus? | ||
| - | |||
| - | | < | ||
| - | 6 | ||
| - | + 9 | ||
| - | --- | ||
| - | | ||
| - | </ | ||
| - | 0000 0110 | ||
| - | + 0000 1001 | ||
| - | ----------- | ||
| - | 0000 1111 | ||
| - | </ | ||
| - | 12 | ||
| - | - 4 | ||
| - | ---- | ||
| - | 8 | ||
| - | </ | ||
| - | 0000 1100 | ||
| - | - 0000 0100 | ||
| - | ----------- | ||
| - | 0000 1000 | ||
| - | </ | ||
| - | | < | ||
| - | 18 | ||
| - | + -6 | ||
| - | ----- | ||
| - | 12 | ||
| - | </ | ||
| - | 0001 0010 | ||
| - | + 1000 0110 | ||
| - | ----------- | ||
| - | 0000 1100 | ||
| - | |||
| - | </ | ||
| - | -5 | ||
| - | - 3 | ||
| - | ---- | ||
| - | -8 | ||
| - | </ | ||
| - | 1000 0101 | ||
| - | - 0000 0011 | ||
| - | ----------- | ||
| - | 1000 1000 | ||
| - | </ | ||
| - | |||
| - | <WRAP center round info 60%> | ||
| - | In der ersten Zeile konnten wir noch einfach wie im Dezimalsystem rechnen. | ||
| - | Sobald negative Zahlen hinzu kommen, müssen wir aber das Vorzeichen separat behandeln. | ||
| - | Wir stellen fest, dass wir unterschiedliche Rechenregeln für positive und negative Zahlen brauchen. | ||
| - | Deshalb ist die Lösung mit dem ersten Bit als Vorzeichen nicht sinnvoll. | ||
| - | </ | ||
| ===== Wrap around ===== | ===== Wrap around ===== | ||