====== LU01i - Binär codierte Ganzahlen ====== //Siehe [[http://www.ulthryvasse.de/index.html]]// Auch wenn es oft geschrieben wird: Es gibt keine binären Zahlen; Genauso wenig wie es dezimale Zahlen gibt. Korrekt ausgedrückt handelt es sich um die binäre Darstellung oder binäre Codierung von Zahlen. Und damit wünsche ich viel Erfolg und Spass mit den binären Zahlen in diesem Kapitel. LOL ===== Binär codierte Ganzzahlen ===== Diese Codierung wird unter anderem für Variablen vom Typ ''int'', ''short'' und ''long'' verwendet. Die Zahlen werden einfach im binären Zahlensystem (siehe auch [[modul:m114:learningunits:lu01:zahlensysteme]]) gespeichert und verarbeitet. Auf das Speichern und Verarbeiten von Brüchen wird bewusst verzichtet. ==== Positive Zahlen ==== 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. 1011 00102 = 178 Wie das geht, erfahren Sie im Kapitel [[modul:m114:learningunits:lu01:umrechnentheorie]]. ==== Negative Zahlen als Zweierkomplement ==== //Siehe auch [[http://de.wikipedia.org/wiki/Zweierkomplement]]// In der Informatik wird für binäre Ganzzahlen das Zweierkomplement verwendet. Mit dieser Technik können Rechenoperationen ohne spezielle Regeln für positive und negative Zahlen eingesetzt werden. Mehr dazu erfahren Sie im Kapitel [[modul:m114:learningunits:lu02:binaermath]]. Für positive Zahlen bedeutet das Zweierkomplement nur, dass die erste binäre Stelle Bit '0' sein muss. Für negative Zahlen gehen Sie wie folgt vor: - Addieren Sie 1 zur Zahl: -1310 + 110 = -1210 - Entfernen Sie das Vorzeichen der Zahl: -1210 => 1210 - Übertragen Sie die Zahl ins Binärsystem: 1210 = 0000 11002 - Invertieren Sie alle Bits: 0000 11002 => **1111 00112** Negative Zahlen haben immer Bit '1' an erster Stelle. Um eine negative binäre Ganzzahl ins Dezimalsystem zu übertragen, kehren Sie einfach das oben stehende Vorgehen um: - Invertieren Sie alle Bits: 1111 00112 => 0000 11002 - Übertragen Sie die Zahl ins Dezimalsystem: 0000 11002 = 1210 - Fügen Sie das Vorzeichen hinzu: 1210 => -1210 - Subtrahieren Sie 1 von der Zahl: -1210 - 110 = **-1310** == Umwandlung ins Zweierkomplement von Hand == Dieser Programmablaufplan zeigt, wie Sie das Zweierkomplement einer binären Zahl ohne zu rechnen erhalten. Dies stellt eine Alternative zum oben beschriebenen Vorgehen dar: {{:modul:m114:learningunits:lu01:zweierkomplement.png?600|}} === 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 ... * '0' => positive Zahl. * '1' => negative Zahl. Zum Speichern der Zahlen ist diese Lösung problemlos. Weniger als 1 Bit um das Vorzeichen darzustellen, können wir gar nicht verwenden. Wie sieht es aber beim Rechnen mit diesen Zahlen aus? | 6 + 9 --- 15 | 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 | 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 ===== Mit Wrap around bezeichnen wir das Verhalten, wenn aus einer positiven Zahl plötzlich eine negative Zahl wird. Am Besten lässt sich das Verhalten an einem Beispiel erläutern. ==== Beispiel ==== Für unser Java-Beispiel verwenden wir den Datentyp ''byte'' mit 8 Bit Speicherplatz. In einer Endlosschleife (''while (true)'') addieren wir immer 1 zur Zahl. byte kleineZahl = 124; while (true) { kleineZahl = kleineZahl + 1; System.out.println(kleineZahl); } == Ausgabe == 125 126 127 -128 -127 ... Wieso ergibt 127 + 1 = -128? Ein Blick in die binäre Codierung der Zahl lüftet das Geheimnis. {{:topics:ict:theory:binarynumbers:wraparound01.png?400|}} Addiert man zur Zahl 12710 (binär 0111 11112) Eins dazu, so erhält man ''1000 0000''2. Wie Sie gelernt haben, bedeutet die binäre Ziffer 1 an der ersten Stelle, dass es sich um eine negative Zahl handelt. Wir erhalten also -12810. Im Gegensatz zur Mathematik haben wir also keinen Zahlenstrahl, sondern einen Zahlenkreis. {{http://wvsg.schulen2.regensburg.de/joomla/images/Faecher/Informatik/Informatik_12/Bilder/3_2_Registermaschine/Zahlenkreis_8_Bit.png?400|}} ---- {{tag>m114-A1G m114-A1F}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter