Vorlesung Programmieren Zahlendarstellung Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/pfisterer
Agenda Zahlendarstellung Oder: wie rechnen Computer? Security - 04 Cryptology #2
Dezimalsystem Normal rechnen wir im Dezimalsystem Basis 10 10 verschiedene Symbole (0 bis 9) zur Zahlendarstellung vorhanden Größere Zahlen werden durch Sequenz von Symbolen gebildet Stelle bestimmt Wertigkeit des Symbols 0 + 1 = 1 1 + 1 = 2 2 + 1 = 3 3 + 1 = 4 4 + 1 = 5 5 + 1 = 6 6 + 1 = 7 7 + 1 = 8 8 + 1 = 9 9 + 1 = 10 Security - 04 Cryptology #3
Dezimalsystem Darstellung von Zahlen in Summenform möglich 1 10 0 1 10 0 10 10 1 1 10 1 100 10 2 1 10 2 Beispiele 20 = 2 10 1 + 0 10 0 1024 = 1 10 3 + 0 10 2 + 2 10 1 + 4 10 0 1.000 10 3 1 10 3 10.000 10 4 1 10 4 100.000 10 5 1 10 5 Security - 04 Cryptology #4
Generalisierung: Andere Basen Wir verwenden (normalerweise) das Dezimalsystem Sehr einfach, damit (als Mensch) zu rechnen Man kann jedoch auch Zahlensysteme mit beliebigen anderen Basen verwenden z.b. zur Basis b = 2, 3, 8, 16 oder 34 Unterscheidung von Zahlen verschiedener Basen Optional: tiefgestellte Angabe der Basis 12 zur Basis 10: 12 10 12 zur Basis 16: 12 16 Security - 04 Cryptology #5
Generalisierung: Andere Basen Man benötigt b verschiedene Symbole zur Darstellung Beispiel: b = 11 Symbole: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A Rechnen: 0+0 = 0, 9+1 = A oder 9+2 = 10 Symbole: A, B, C, D, E, F, G, H, I, J, K Rechnen: A+A = A, J+B=K oder J+C = BA Security - 04 Cryptology #6
Wichtiges Zahlensystem: Binärsystem Um die technische Realisierung möglichst einfach zu halten, arbeitet ein moderner Rechner binär Binär: Zwei Zustände Mögliche Symbole An, aus Strom, kein Strom 0, 1 A, B Security - 04 Cryptology #7
Binärsystem Symbole: 0 und 1 Eine Binärziffer heißt Bit (binary digit) Folge von 8 Bit heißt Byte Rechnen 0 + 0 = 0 1 + 0 = 0 1 + 1 = 10 Basis 2 Basis 2 Basis 10 0 + 1 = 1 1 1 + 1 = 10 2 10 + 1 = 11 3 11 + 1 = 100 4 100 + 1 = 101 5 101 + 1 = 110 6 110 + 1 = 111 7 111 + 1 = 1000 8 1000 + 1 = 1001 9 1001 + 1 = 1010 10 Security - 04 Cryptology #8
Binärsystem und Computer Computer besitzen Arbeitsspeicher Besteht aus Menge von 1-Bit Speichern Jeweils Gruppe von 8 speichert ein Byte Jedes Byte ist unter einer bestimmten Adresse erreichbar Jedes Byte kann individuell gelesen und geschrieben werden Bit-weiser Zugriff nicht möglich Arbeitsspeicher 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1... 0 0 0 0 0 0 0 1 0003 0 0 1 1 1 0 1 0 0002 0 1 0 1 0 1 0 0 0001 0 0 0 0 1 0 1 0 Beispiel (Pseudocode) setze_adresse[3] = 58 10 gebe_aus_adresse[3] 58 10 Security - 04 Cryptology #9
Darstellung von Zahlen im Binärsystem Analog zum Dezimalsystem Beispiel 101 2 Basis 10: 1 2 2 + 0 2 1 + 1 2 0 Basis 2: 1 10 10 + 0 10 1 + 1 10 0 Diese Darstellung erlaubt einfaches Umrechnen in andere Zahlensysteme Basis 2 Basis 10 Basis 2 1 2 0 10 0 10 2 1 10 1 100 2 2 10 10 1000 2 3 10 11 10000 2 4 10 100 100000 2 5 10 101 Security - 04 Cryptology #10
Beziehung Dezimal- Binärsystem Beispiel: 14 Zahlenbasis 10 : Tausender Hunderter Zehner Einer 10 3 = 1000 10 10 2 = 100 10 10 1 = 10 10 10 0 = 1 10 0 0 1 4 Zahlenbasis 2 : 3 2 1 0 10 + 0 10 + 1 10 + 4 10 0 2 3 = 8 10 2 2 = 4 10 2 1 = 2 10 2 0 = 1 10 1 1 1 0 3 2 1 1 2 + 1 2 + 1 2 + 0 2 0 11
Beispiel: 1110 2 Umrechnung: Binär- nach Dezimalsystem 2 3 2 1 2 1 + + 6 7 2 0 2 1 + + Beispiel: 10010111 2 12 10 0 1 14 2 0 2 1 = + 10 0 1 2 3 4 5 151 2 1 2 1 2 1 2 0 2 1 2 0 = + + + + +
Umrechnung: Dezimal- nach Binärsystem Horner-Schema 14 7 3 1 2 2 2 2 = 7R0 Least significant bit (LSB) = 3R1 = 1 R1 = 0R1 Most significant bit (MSB) 1110 MSB LSB 13
Hexadezimalsystem (zur Basis 16) Neben dem Binärsystem gibt es für den Programmierer noch ein weiteres wichtiges Zahlensystem Das Hexadezimalsystem, kurz: hex 16 Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f a bis f stehen für die Zahlen 10 bis 15 Groß-/Kleinschreibung unerheblich (a = A) Umrechnung zwischen Dezimal und Hex analog zum Binärsystem 14
Dezimal-, Binär- & Hexadezimalsystem Beispiel: 253 Zahlenbasis 10 : Zahlenbasis 2 : Hunderter Zehner Einer 10 2 10 1 10 0 2 5 3 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 1 1 1 1 1 0 1 Zahlenbasis 16 : 16 1 16 0 f d 1 15 16 + 13 16 0 15
Verwendung des Hexdezimalsystems Programmierer verwenden oft Hex-Schreibweise Ziel: Binärzahlen kompakter schreiben Eine Hex-Ziffer entspricht immer vier Bit Bytes werden oft als Folge von zwei Hex-Ziffern angegeben 240 13 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 1 1 1 1 1 0 1 16 1 16 0 f d 16
Rechnen mit binären Zahlen
Rechnen mit binären Zahlen Binäre Darstellung genügt, um alle Rechenaufgaben durchzuführen Alle Grundrechenarten lassen sich auch im binären Zahlensystem durchführen 18
Binäre Addition Wiederholung: Addition im Dezimalsystem 14 + 19 33 Identisches Vorgehen im Binärsystem 1110 + 10011 100001 19
Binäre Subtraktion Wiederholung: Subtraktion im Dezimalsystem 14 2 12 Identisches Vorgehen im Binärsystem 1110 10 1100 20
Binäre Multiplikation Multiplikation im Dezimalsystem 1 4 x 1 7 1 4 9 8 2 3 8 Identisches Vorgehen im Binärsystem 1 1 1 0 x 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 21
Wiederholung: Division im Dezimalsystem 2 3 2 / 3 = 7 7 R 1 2 1 2 2 2 1 1 Identisches Vorgehen im Binärsystem 1 1 1 0 1 0 0 0 / 1 1 = 1 0 0 1 1 0 1 R 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 22
Zwischenergebnis Alle Grundrechenarten funktionieren auch im Binärsystem Natürlich auch in allen anderen Zahlensystemen Insbesondere auch im Hexadezimalsystem Bisher: Nur positive ganze Zahlen Wie geht man mit vorzeichenbehafteten ganzen Zahlen um? Wie stellt man -7 im Computer dar? 23
Negative Zahlen
Negative Binärzahlen mit Vorzeichenbit Beispiel: 3-Bit-Zahlen Vorzeichen Bit 1 Bit 0 Dezimalwert 1 1 1-3 1 1 0-2 1 0 1-1 1 0 0-0 0 0 0 0 0 0 1 1 0 1 0 2 0 1 1 3 Bewertung: Prinzipiell ok Nachteile: Zwei Nullen VZ-Bit muss ausgewertet werden Für Maschinen nicht optimal 25
Negative Binärzahlen im Einerkomplement Zur Vorzeichenumwandlung (+ - bzw. -+) wird jedes Bit invertiert Beispiel: -7 10 Darstellung als 4-Bit Binärzahl: -0111 2 Bitweise invertiert: 1000 2 Erstes Bit 1: negative Zahl Zahlenwert bestimmen: Invertieren 1000 2-0111 2-7 10 Security - 04 Cryptology #26
Negative Binärzahlen im Einerkomplement Es ergibt sich folgender Zusammenhang: 1001-7 1000 0111-6 6 7 0110-5 5 1010 0101 1011-4 negative Zahlen positive Zahlen 4 0100 1100-3 3 0011 1101-2 2 0010 1110-1 0 1 0001 1111 0000 27
Negative Binärzahlen im Einerkomplement Vorteile Einerkomplementzahlen können prinzipiell direkt (d.h. bitweise) addiert werden! Beispiel: 3 7 = 3 + (-7) Nachteile Problem: Round Carry: siehe nächste Folie Zwei Nullen Security - 04 Cryptology #28
Addition im Einerkomplement: 4+(-2) Problem bei Addition: Round Carry 0100 + 1101 Übertrag! (1)0001 + 0001 0010 29
Negative Binärzahlen im 2er-Komplement Alternative zum 1er-Komplement Vorzeichenumwandlung Invertiere bitweise und addiere 1 Alternativ: 1er-Komplement + 1 Beispiel: -7 10-0111 2 invertiere(0111 2 ) +1 2 1000 2 + 1 2 1001 2 Security - 04 Cryptology #30
Negative Binärzahlen im 2er-Komplement Positive Zahlen: Höchstes Bit ist 0 1010 1001-6 -7 1000-8 -5 5 1011 0101 7 0111 6 0110 Negative Zahlen: Höchstes Bit ist 1 1101-4 -3 1110-2 1111-1 0 0000 1 2 0001 4 3 0010 0100 0011 31
Addition im 2er-Komplement Beispiel: 4+(-2) Als 4-Bit Zahl 0100 4 10 = 0100 2-2 10 = 1110 2 2er-Komplementdarstellung ist sehr praktisch! Moderne Rechner arbeiten mit dieser Darstellung + 1110 10010 0010 Übertrag kann ignoriert werden 32
2er-Komplement und moderne Rechner Ganze Zahlen werden im Arbeitsspeicher in 2er- Komplementdarstellung abgelegt Man sieht der binären Repräsentation der Zahl nicht an, dass sie im 2er-Komplement dargestellt ist Es könnte auch eine 4-Bit positive Zahl sein Es kommt darauf an, wie man dieses Muster interpretiert Arbeitsspeicher 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1... 0 0 0 0 0 0 0 1 0003 0 0 1 1 1 0 1 0 0002 0 1 0 1 0 1 0 0 0001 0 0 0 0 1 0 1 0 Security - 04 Cryptology #33
Reelle Zahlen
Darstellung reeller Zahlen Bisher nur ganze Zahlen betrachtet Für viele Aufgaben benötigt man jedoch reelle Zahlen Wie stellt man diese im Computer dar? Antwort: gar nicht Computer haben nur einen endlichen Speicher Unmöglich potentiell unendlich lange Zifferfolgen darzustellen Aber: Man kann auf einige Nachkommastellen genau rechnen 35
Festkommadarstellung Typischerweise hat man im Computer eine feste Anzahl an Speicher für eine Zahl verfügbar Eine Möglichkeit: Diese Anzahl aufteilen in Teil vor dem Komma und dahinter Beispiel im Dezimalsystem: je 3 Stellen vor und nach dem Komma Es sind je 1000 Zahlen darstellbar Diese sind in jeweils 1000 Teilschritte unterteilt Beispiel: 175,381 Hunderter Zehner Einer Zehntel Hundertstel Tausendstel 10 2 10 1 10 0 10-1 10-2 10-3 1 7 5 3 8 1 36
Festkommadarstellung Äquivalente Darstellung im Binärsystem möglich Annahme: 32 Bit Breite Ergibt 16 Binärstellen und 16 binäre Nachkommastellen Damit sind 65.536 Zahlen darstellbar Diese sind jeweils wieder in 65.536 Teilschritte unterteilt Beispiel: 1001 0110 1010 0001, 1010 0101 0000 0010 2 15 2 14 2 13 2 12 2 11 2 10 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11 2-12 2-13 2-14 2-15 2-16 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 37
Festkommadarstellung (Umrechnungen) Binärsystem Dezimalsystem (siehe weiter vorne) Dezimalsystem Binärsystem Ebenfalls mit Horner-Schema Getrennte Berechnung von Vor- und Nachkommateil Vorkommateil: Division durch 2 mit Rest Nachkommaanteil: Division Multiplikation! (wegen negativer Exponenten) Beispiel: Umrechnung von 14, 1 (nächste Folie) 38
Beispiel: 14,1(nur Vorkommateil 14) Ergebnis: 1110 14 / 2 = 7 R 0 LSB 7/2 = 3 R 1 3/2 = 1 R 1 1/2 = 0 R 1 MSB 39
Beispiel: 14,1(nur Nachkommateil 0,1) 0,1 von dezimal nach binär 0,1 x 2 = 0,2 = 0,2 + 0 MSB 0,2 x 2 = 0,4 = 0,4 + 0 0,4 x 2 = 0,8 = 0,8 + 0 0,8 x 2 = 1,6 = 0,6 + 1 0,6 x 2 = 1,2 = 0,2 + 1 0,2 x 2 = 0,4 = 0,4 + 0 LSB Ergebnis (mit 16 Bit): 0, 0001 1001 1001 1001 Erstaunlich: Nachkommateil ist periodisch Darstellung mit endlicher Bitanzahl ist nicht exakt! Dennoch muss man irgendwann abschneiden (z.b. nach 16 Bit) 40
Fließkommazahlen Wertebereich und Genauigkeit von Festkommazahlen oft zu gering Große Zahlen: Wunsch nach größerem Wertebereich Nachkommateil nicht so relevant Beispiel: 343847348734734,01 Kleine Zahlen: Wunsch nach mehr Nachkommastellen Dafür ist vor dem Komma nicht so viel Spielraum Beispiel: 1,3434378343784384 Lösungsansatz Schreibe Zahl D als Produkt aus Festkommazahl und Potenz D = X * 10 Y (X, 10 und Y sind Dezimalzahlen!) Bekannt aus dem Physikunterricht: 1,5637 * 10-6 m/s² 41
Fließkommazahlen Exponent bewirkt Verschiebung des Kommas Daher der Name Fließkommazahl Beispiel: 101,1 * 10 11 = 101100,0 Mantisse Exponent (Achtung: Alles Binärzahlen) Sinnvoll: Mantisse mit 1 beginnen zu lassen Also 1,xxxxxx Die Kommaverschiebung vermerkt man im Exponenten Eine solche Zahl heißt normalisiert 42
32-Bit-Fließkommazahlen nach IEEE 754 Rechner verwenden Darstellung nach IEEE 754 IEEE 7534 verwendet Platzspartrick Mantisse beginnt immer mit einer 1 (außer bei der Zahl 0) Durch Weglassen dieser Ziffer gewinnt man ein Bit Format einer 32-Bit IEEE 754-Fließkommazahl V Exponent (8 Bit) Mantisse (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Vorzeichen (1-Bit) 43
32-Bit-Fließkommazahlen nach IEEE 754 Wert des Exponenten e effektiv definiert als e effektiv = e 01111111 2 (= e - 127 10 ) Dadurch gilt e = 0000 0001 (1-127 = -126) e effektiv = -126 e = 0111 1111 (127 127 = 0) Komma nicht verschoben e = 1111 1110 (254 127 = 127) e effektiv = +127 V Exponent e (8 Bit) Mantisse m (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 44
32-Bit-Fließkommazahlen nach IEEE 754 Binärer Wert g einer Fließkommazahl (für e 0 und m 0) g = ( 1) v (1, m) 10 e 01111111 Problem: Darstellung der 0 (1,m x immer ungleich 0) Daher Sonderfälle e=0 und m 0 Zahl ist denomalisiert (0,M) e=0 und m=0 Darstellung der Zahl 0 e=1111 1111 und m 0 NaN (Not a Number) e=1111 1111 und m=0 Unendlich (Infinity, je nach Vorzeichen +/-) V Exponent e (8 Bit) Mantisse m (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 45
Umrechnung IEEE 754 Dezimalzahl Mantisse und Exponent in Dezimalzahlen umrechnen Damit folgende Formel benutzen g dezimal M v 23 edezimal = ( 1) (1,0 + dezimal / 2 ) 2 127 Beispiel: 0100 0000 0010 0000 0000 0000 0000 0000 v=0 0 10 e=1000 0000 2 7 10128 10 m= 010 0000 0000 0000 0000 0000 2 21 102097152 10 0 21 23 128 127 = ( 1) (1,0 + 2 / 2 ) 2 g dezimal = 1 (1 + 2 = 1,25 * 2 = 2,5 2 ) 2 1 46
Dezimalzahl IEEE 754 (am Bsp. für 14,1) 1. Dezimalzahl in Festkommabinärzahl umrechnen (mit 23 Binärstellen hinter erster 1) 1110, 0001 1001 1001 1001 1001 2. Verschiebe Komma um n Stellen nach, sodass Zahl die Form 1, bekommt 1,110 0001 1001 1001 1001 1001 n=3 3. Schreibe das Vorzeichenbit (1 falls negativ, 0 sonst) v=0 4. Rechne e=n+127 und schreibe binäre Darstellung von e 3+127=130 e= 1000 0010 5. Schreibe m (Bitfolge hinter dem Komma aus Schritt 2) m=110 0001 1001 1001 1001 1001 47
Dezimalzahl IEEE 754 (am Bsp. für 14,1) Zwischenergebnis v=0 e= 1000 0010 m=110 0001 1001 1001 1001 1001 Darstellung nach IEEE 754 Ergebnis 0 100 0001 0110 0001 1001 1001 1001 1001 Wirklichkeit 0 100 0001 0110 0001 1001 1001 1001 1010 ( komplizierte Rundungsregeln, ignorieren wir) 48
Rechnen mit Fließkommazahlen 1. Exponenten angleichen Zahl mit kleinerem Exponenten wird denormalisiert Grund: Kein Spezialfall für mehr als eine Stelle vor dem Komma! 2. Mantissen addieren, subtrahieren, multiplizieren oder dividieren 3. Ergebnis normalisieren 4. Fertig! 49
Rechnen mit Fließkommazahlen (Beispiel) 1. 12,75 + 53,5 2. 12,75 1100,11 e 1 = 3 + 127 = 130 10000010 m 1 = 10011 000000000000000000 53,5 110101,1 e 2 = 5 + 127 = 132 10000100 m 2 = 101011 00000000000000000 3. e 1 < e 2 e 1 anpassen! 0,01100110000000000000000 +1,10101100000000000000000 10,00010010000000000000000 66,25 0100 0010 1000 0100 1000 000000000000 1,000010010000000000000000 e 3 = 133! 50
Fließkommazahlen: Vor- und Nachteile Vorteile Fühlen sich für Programmierer wie reelle Zahlen an Großer Wertebereich, inkl. Werten für 0, +inf und inf Nachteile Sind nur endlich genau! Zahlen, die im Dezimalsystem exakt dargestellt werden können, müssen im Binärsystem u.u. gerundet werden. Durch diese Ungenauigkeit kommt es schon bei einfachen Rechnungen zu Rundungsfehlern Beispiele: siehe nächste Folie 51
Fließkommazahlen: Rundungsfehler 1234.567 3.333333 = 4115.223 1.234567 3.333333 = 4.115223 4115.223 + 4.115223 = 4119.338 aber: 1234.567 + 1.234567 = 1235.802 1235.802 3.333333 = 4119.340 Distributivgesetz verletzt: a * x + b * x!= (a+b) * x Konsequenz Für exakte Berechnungen (z.b. im Bankwesen) sind Fließkommazahlen ungeeignet Double-Precision (64 Bit IEEE 754): 1 Vorzeichenbit, 11 Bit Exponent, 52 Bit Mantisse 52
Zusammenfassung Zahlensysteme mit verschiedenen Basen Umwandlung zwischen Zahlensystemen (2er, 10er, 16er) Rechnen mit diesen Darstellungen Binäre Zahlendarstellung im Computer Ganze Zahlen (mit/ohne Vorzeichen) 1er- und 2er-Komplement Fließkommadarstellung Grenzen (Wertebereich, Genauigkeit)? Bitmuster im Speicher enthält keine Information über Art der Interpretation Als Programmierer muss man dies wissen bzw. beim Programmieren definieren Beginnt an Adresse 3 z.b. eine 8 Bit Zahl oder 32 Bit? Ganzzahl, 1er- / 2er-Komplement oder IEEE 754 Kodierung? 53