Vom Problem zum Programm Zahlendarstellung - Konvertierung Dezimal Dual/Binär Oktal Hexadezimal Einer-/Zweierkomplement Einfache Standard-Datentypen Integer Real Character Darstellung im Speicher Aussagenlogik Boolesche Algebra Zahlendarstellung Zahlen, insbesondere die natürlichen Zahlen (,, 2, 3, ) und die ganzen Zahlen (, -3, -2, -,,, 2, 3, ) sind von der Schule bekannt. Es geht im Folgenden nicht um die Eigenschaft, sondern um die Darstellung der Zahlen. Das im täglichen Umgang vertraute Dezimalsystem findet seinen Begründung darin, dass der Mensch Finger zum Zählen hat. Mathematische aussagen sind aber unabhängig davon, wie viele Finger derjenige hat, der sie formuliert. Eine intelligente Spezies mit 8 Fingern würde sicherlich die gleiche Mathematik entwickeln wir, nur die Darstellung ist eine andere. Die Gesetze des Zählens und Rechnens sind unabhängig von der Darstellung immer die gleichen. In der Datenverarbeitung ist die Darstellung im Dezimalsystem denkbar ungeeignet. Grundlagen der Informatik I - Teil 3
Zahlendarstellung Es bieten sich Dual-, Oktal- oder Hexadezimalsystem zur Darstellung an. Weitere Darstellungsmethoden sind z.b. Kettenbrüche oder die römische Zahlendarstellung). Die vermeintliche Überlegenheit des Dezimalsystems gegenüber den anderen diskutierten Systemen beruht ausschließlich auf der langjährigen Vertrautheit mit dieser speziellen Darstellung. Würde man als Kind nur die Hexadezimaldarstellung lernen, würde man dies als das natürlichste und einfachste aller Zahlensysteme empfinden. Zahlendarstellung Die folgenden Betrachtungen basieren auf dem bekannten Prinzip der "Division mit Rest". Dies Prinzip lautet: Gegeben sind zwei ganze Zahlen a und b mit a >= und b >. Dann gibt es genau zwei ganze Zahlen m (Multiplikator) und r (Rest) mit: m >= <= r < b a = m * b + r Wählen wir a = 5349 und b = 8 so erhalten wir bei der Division von 5349 durch 8: 5349 = 668 * 8 + 5 Also m = 668 (Multiplikator) und r = 5 (Rest) Wir bearbeiten den Multiplikator nach der gleichen Methode weiter 668 = 83 * 8 + 4 83 = * 8 + 3 = * 8 + 2 = * 8 + bis er ganz verschwunden ist. Grundlagen der Informatik I - Teil 3 2
Zahlendarstellung Zusammensetzen der einzelnen Puzzlesteine 5349 = 668 * 8 + 5 = (83 * 8 + 4) * 8 + 5 = (( * 8 + 3) * 8 + 4) * 8 + 5 = ((( * 8 + 2) * 8 + 3) * 8 + 4) * 8 + 5 = (( * 8 2 + 2 * 8 + 3) * 8 + 4) * 8 + 5 = ( * 8 3 + 2 * 8 2 + 3 * 8 + 4) * 8 + 5 = * 8 4 + 2 * 8 3 + 3 * 8 2 + 4 * 8 + 5 * 8 Die Ausgangszahl lässt sich mit geeigneten Koeffizienten als Summe von Potenzen der Basiszahl 8 darstellen. Wesentlich sind dabei die vor den Potenzen auftretenden Koeffizienten, die nach dem Prinzip der Division mit Rest eindeutig bestimmt sind und im Bereich von bis 7 liegen können. Da die Potenzen durch ihre Stellung in der Formel eindeutig festgelegt sind, kann man vereinfacht schreiben 5349 = (2345) 8 Oktaldarstellung - Beispiel 5349 = 668 * 8 + 5 668 = 83 * 8 + 4 83 = * 8 + 3 = * 8 + 2 = * 8 + Ergebnis: 2345 5349 / 8 = 668 Rest 5 668 / 8 = 83 Rest 4 83 / 8 = Rest 3 / 8 = Rest 2 / 8 = Rest Ergebnis: 2345 Grundlagen der Informatik I - Teil 3 3
Zahlendarstellung Den Zusatz der Basiszahl kann man weglassen, wenn aus dem Zusammenhang klar ist, welche Basiszahl gemeint ist. Da beliebige Zahlen a und b gewählt wurden, gilt, dass eine beliebige Ausgangszahl a (a >= ) in dieser Weise bezüglich einer beliebigen Basis b (b > ) zerlegt werden kann. Beschränkt man sich auf n Stellen, können bzgl. der Basis b auf diese Weise die Zahlen von bis b n - dargestellt werden. Dezimaldarstellung Das Dezimalsystem ordnet sich in die zuvor dargestellte Zusammenhänge ein. Für b = und mit den Ziffernsymbolen,, 2,, 9 erhält man die vertraute Dezimaldarstellung Zum Beispiel: 56789 = 5 * 4 + 6 * 3 + 7 * 2 + 8 * + 9 * Grundlagen der Informatik I - Teil 3 4
Dualdarstellung Es wird das zuvor angesprochene Verfahren verwendet. Ausgangszahl wird sukzessive durch 2 dividiert. Die gesuchte Dualzahl erhält man über die Divisionsreste. Beispielzahl: 56789 Dualdarstellung - Beispiel 56789 / 2 = 28394 Rest 28394 / 2 = 497 Rest 497 / 2 = 798 Rest 798 / 2 = 3549 Rest 3549 / 2 = 774 Rest 774 / 2 = 887 Rest 887 / 2 = 443 Rest 443 / 2 = 22 Rest 22 / 2 = Rest / 2 = 55 Rest 55 / 2 = 27 Rest 27 / 2 = 3 Rest 3 / 2 = 6 Rest 6 / 2 = 3 Rest 3 / 2 = Rest / 2 = Rest Ergebnis: Grundlagen der Informatik I - Teil 3 5
Dualdarstellung Um das Ergebnis wieder ins Dezimalsystem zurückzurechnen, muss nur ausgerechnet werden: ()2 = * 2 5 + * 2 4 + * 2 3 + * 2 2 + * 2 + * 2 + * 2 9 + * 2 8 + * 2 7 + * 2 6 + * 2 5 + *2 4 + * 2 3 + * 2 2 + * 2 + * 2 = 32768 + 6384 + 494 + 248 + 24 + 256 + 28 + 64 + 6 + 4 + = 56789 und man erhält die ursprüngliche Darstellung im Dezimalsystem zurück. Dualdarstellung Das Dualsystem ist das Zahlensystem, in dem Computer rechnen. Für Menschen hat das aber erhebliche Nachteile: Wegen der kleinen Basis sind die Zahlen zu lang und umständlich zu handhaben. Es fehlt eine "Größenvorstellung" von Dualzahlen. Der Mensch braucht zusätzliche Zahlensysteme, die eine einfache Umrechnung ins Dualsystem erlauben, dabei aber "menschenfreundlicher" sind als das Dualsystem. Grundlagen der Informatik I - Teil 3 6
Oktaldarstellung Das Oktalsystem hat die Basis 8 und benutzt die Ziffern,, 2,, 7. Die besondere Eignung der Basiszahl 8 liegt darin begründet, dass es sich um eine Potenz von 2 (8 = 2 3 ) handelt. Dadurch ergibt sich eine einfache Umrechnung von Dualzahlen in Oktalzahlen und umgekehrt. Oktaldarstellung Die Umrechnung von Oktalzahlen in Dezimalzahlen und umgekehrt folgt dem von den Dualzahlen bekannten Schema. In der einen Richtung ermittelt man die Reste durch fortlaufende Division durch 8: 56789 / 8 = 798 Rest 5 798 / 8 = 887 Rest 2 887 / 8 = Rest 7 / 8 = 3 Rest 6 3 / 8 = Rest 5 / 8 = Rest Ergebnis: 56725 In der anderen Richtung rechnet man einfach aus: (56725) 8 = * 8 5 + 5 * 8 4 + 6 * 8 3 + 7 * 8 2 + 2 * 8 + 5 * 8 = 32768 + 248 + 372 + 448 + 6 + 5 = 56789 Grundlagen der Informatik I - Teil 3 7
Oktaldarstellung Zur Umrechnung fasst man die Ziffern der Dualzahl vom Ende her in 3-er Gruppen zusammen und übersetzt dann ziffernweise mit Hilfe der folgenden Tabelle: Oktal 2 3 4 5 6 7 Dual Oktaldarstellung Die Umrechnung in beide Richtungen (Oktal => Dual und Dual => Oktal) ist damit praktisch ohne Aufwand "im Kopf" durchführbar: Umrechnung Dual <=> Oktal Dual Oktal 2 6 3 5 Grundlagen der Informatik I - Teil 3 8
Hexadezimaldarstellung Das Hexadezimalsystem hat die Basis 6 und benutzt die Ziffern,, 2,, 9, und für die Darstellung der Ziffern..5 die Zeichen a, b,, f bzw. A, B,, F. Die besondere Eignung der Basiszahl 6 liegt darin begründet, dass es sich um eine Potenz von 2 (6 = 2 4 ) handelt. Damit ergibt sich folgende Umrechnungstabelle für Ziffern (nächste Seite!) Hexadezimaldarstellung Hexadezimal Dezimal Oktal Dual 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 9 9 A 2 B 3 C 2 4 D 3 5 E 4 6 F 5 7 Grundlagen der Informatik I - Teil 3 9
Hexadezimaldarstellung Die 6 eine Potenz von 2 ist, kann für das Umrechnen ins Dualsystem und umgekehrt ein ähnliches verfahren verwendet werden, wie bei der Umrechnung ins Oktalsystem. Jetzt werden allerdings 4 Ziffern der Dualdarstellung zusammengefasst.: Umrechnung Hex <=> Dual <=> Oktal Hexadezimal 5 9 D Dual Oktal 2 6 3 5 Hexadezimaldarstellung Die Umrechnung von Hexadezimalzahlen in Dezimalzahlen und umgekehrt folgt dem von den Dualzahlen bekannten Schema. In der einen Richtung ermittelt man die Reste durch fortlaufende Division durch 6: 56789 / 6 = 3549 Rest 5 3549 / 6 = 22 Rest 3 (entspricht d) 22 / 6 = 3 Rest 3 (entspricht d) 3 / 6 = Rest 3 (entspricht d) Ergebnis: ddd5 In der anderen Richtung rechnet man einfach aus: (ddd5) 6 = 3 * 6 3 + 3 * 6 2 + 3 * 6 + 5 * 6 = 53248 + 3328 + 28 + 5 = 56789 Das Hexadezimalsystem ist das üblicherweise in der maschinennahen Programmierung verwendete Zahlensystem. Eine gewisse Vertrautheit mit diesem Zahlensystem ist daher unumgänglich. Grundlagen der Informatik I - Teil 3
Bits and Bytes Die kleinste Informationseinheit auf einem Digitalrechner bezeichnen wir als Bit (Binary digit, bzw. engl bit = ein bisschen, nicht das Bier aus der Eifel). Ein Bit kann die logischen Werte (Bit gelöscht) und (Bit gesetzt) annehmen. Alle Informationen auf einem Rechner (Programme und Daten) sind als Folgen von Bits gespeichert. Den Speicherinhalt eines Rechners kann man zu einem bestimmten Zeitpunkt als sehr lange Folge von Bits ansehen. Um Teile dieser Information gezielt ansprechen und manipulieren zu können, muss der Bit-Folge eine Struktur gegeben werden. Zunächst fasst man jeweils 8 Bit zusammen und nennt diese - Größe ein Byte Bits und Bytes Byte Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit Bit Als Dualzahl interpretiert kann ein Byte also Zahlen von - 255 (hex. - ff) darstellen. Bit 7 bezeichnet man als das höchstwertige (most significant) Bit, Bit als das niedrigstwertige (least significant) Bit. Als Dualzahl interpretiert hat das höchstwertige Bit den Stellenwert 2 7 = 28, das niedrigstwertige den Wert 2 =. Grundlagen der Informatik I - Teil 3
Bits and Bytes Im Speicher will man auch vorzeichenbehaftete Zahlen ablegen Achtung!!! Nicht zwingend eine negative Zahl, sondern es ist Platz für ein Vorzeichen vorgesehen. Zur Speicherung negativer Zahlen wählt man das Zweierkomplement. Das Zweierkomplement einer Dualzahl erhält man, in dem man zunächst das Bitmuster invertiert (man nennt dies das Einerkomplement) und anschließend addiert. Zweierkomplement Dualzahl Einerkomplement Zweierkomplement Die besondere Eignung des Zweierkomplements zur Darstellung negativer Zahlen erkennt man, wenn man eine Zahl und ihr Zweierkomplement addiert. Dualzahl Zweierkomplement Summe () Grundlagen der Informatik I - Teil 3 2
Zweierkomplement Auch andere Rechenaufgaben liefern korrekte Ergebnisse Beispiel: 55 - = 44. Dualdarstellung von 55 Zweierkomplement von Ergebnis: Dualdarstellung von 44 () Das Zweierkomplement eignet sich also zur Darstellung negativer zahlen und zum Rechnen mit vorzeichenbehafteten Zahlen. In einem 8-stelligen Datenwort unseres Beispielrechners lassen sich die Zahlen von -28 bis +27 darstellen. Bits und Bytes Es liegt an uns, ein im Rechner abgelegtes Muster aus Nullen und Einsen als vorzeichenlose oder vorzeichenbehaftete Zahl zu lesen. Beispiel: = 26 = vorzeichenlos = -4 (= + ) = vorzeichenbehaftete Die Bereiche darstellbarer Zahlen werden später noch mal angesprochen. (4) 6 = (2) 8 = 24 Bytes werden zu einem Kilobyte (KB) zusammengefasst. Das Wort "Kilo" stammt aus dem Griechischen und bedeutet Tausend. Ist in diesem Zusammenhang allerdings irreführend. Der "Fehler" zieht sich konsequent durch das gesamte Bemessungssystem für die Speichergröße. (Tabelle!!!) Grundlagen der Informatik I - Teil 3 3
Bits und Bytes Maßeinheit Abk. Hexadezimal Oktal Dezimal 2 x Kilobyte KB 4 2 24 2 Megabyte MB 4 48 576 2 2 Gigabyte GB 4 73 74 824 2 3 Terabyte TB 2 99 5 627 776 2 4 Datentypen Jede Variable muss einen Typ haben. Bis jetzt int und float kennengelernt. In C gibt es nur wenige elementare so genannte skalare Datentypen: Datentyp zur Darstellung numerischer Werte char: ein Byte, kann ein Zeichen aus dem Zeichensatz der Maschine aufnehmen int: ganzzahliger Wert, in der für die Maschine natürlichen Größe (6 bit = 2 Byte, Wertebereich: (2^5):(2^5)- [-32768:32767] float: einfach genauer Gleitkommawert double: doppelt genauer Gleitkommawert Grundlagen der Informatik I - Teil 3 4
Klassifizierung Skalare Datentypen Datentyp Zeichen char unsigned char signed char Skalare Datentypen Ganze Zahlen short int unsigned short signed short unsigned int signed int long unsigned long signed long Aufzählungstyp enum float Gleitkommazahlen double long double Ganze Zahlen Es gibt vier verschiedene Datentypen (char, short, int, long) für ganze Zahlen, die sich bzgl. der Größe der darstellbaren Zeichen unterscheiden. Da es jeweils eine Ausprägung für vorzeichenlose (unsigned) bzw. vorzeichenbehaftete (signed) Zahlen haben, ergeben sich insgesamt acht Kombinationsmöglichkeiten. Der Zusatz signed ist optional und wird von c-programmierern fast nie verwendet. Die angegebenen Zahlenwerte auf der nächsten Seite sind implementierungsabhängig, siehe auch in limits.h. Grundlagen der Informatik I - Teil 3 5
Ganze Zahlen Variablendefinition char x signed char x unsigned char x short x signed short x unsigned short x int x signed int x unsigned int x long x signed long x unsigned long x Bedeutung x ist eine kleine, vorzeichenbehaftete Zahl. Typischerweise eine -Byte-Zahl im Bereich von -28 bis +27. x ist eine kleine, vorzeichenlose Zahl. Typischerweise eine -Byte-Zahl im Bereich von bis +255. x ist eine mittelgroße, vorzeichenbehaftete Zahl. Typischerweise eine 2-Byte-Zahl im Bereich von -32 768 bis +32 767. x ist eine mittelgroße, vorzeichenlose Zahl. Typischerweise eine 2-Byte-Zahl im Bereich von bis +65 535. x ist eine normale, vorzeichenbehaftete Zahl. Typischerweise eine 2- oder 4- Byte-Zahl. x ist eine normale, vorzeichenlose Zahl. Typischerweise eine 2- oder 4- Byte-Zahl. x ist eine große, vorzeichenbehaftete Zahl. Typischerweise eine 4-Byte-Zahl im Bereich von -2 47 483 648 bis +2 47 483 647 (-2 3 bis 2 3 -). x ist eine große, vorzeichenlose Zahl. Typischerweise eine 4-Byte-Zahl im Bereich von bis +4 294 967 295 ( bis 2 32 -). Ganze Zahlen Wenn im Programm konkrete Integer-Zahlenwerte für Berechnungen oder Zuweisungen benötigt werden, gibt es drei verschiedene Möglichkeiten. Der Zahlenwert kann dezimal, oktal oder hexadezimal angegeben werden. Dezimaldarstellung: alltägliches Zahlenformat Oktaldarstellung: Den Ziffern wird eine vorangestellt. Hexadezimaldarstellung: Den Ziffern wird x vorangestellt. Beispiele: long a = 2345; /* dezimal 2345 */ unsigned int a = xaffe; /* dezimal 4554 */ unsigned char a = 377; /* dezimal 255 */ Grundlagen der Informatik I - Teil 3 6
Aufzählungstypen Beim Datentyp enum handelt es sich um einen benutzerdefinierten Aufzählungstyp, bei dem der Programmierer selbst geeignete Namen für einzelne Werte vergeben kann. Beispiel Wochentag: enum wochentag { Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag }; Einmal deklariert ist Wochentag ein Datentyp wie int, der die Werte Montag Sonntag annehmen kann. Verwendet wird ein Aufzählungstyp dann wie folgt: enum wochentag tag; int datum; tag = Freitag; datum = 3; if (( Freitag == tag ) && ( 3 == datum )) { cout << Vorsicht, heute ist Freitag der 3ste! << endl; } Aufzählungstypen Welche Zahlenwerte Montag Sonntag zugeordnet werden, ist nicht festgelegt. Man kann es jedoch erzwingen durch: enum wochentag { Montag=, Dienstag=2, Mittwoch=3, Donnerstag=4, Freitag=5, Samstag=6, Sonntag=7 }; In C wird nicht überprüft, ob Variablen von einem Aufzählungstyp wirklich nur die für diesen Aufzählungstyp definierten Werte enthalten. So kann man diesen Zahlen einen beliebigen int-zahl zuweisen und wie mit int rechnen. Beispiel: tag = 2; Aufzählungstypen haben also keine weitere Funktionalität, sondern dienen eher der Lesbarkeit eines Programms. Grundlagen der Informatik I - Teil 3 7
Gleitkommazahlen Neben den Integer-Datentypen gibt es in C drei Datentypen für Gleitkommazahlen (float, double, long double). Variablendeklaration float x double x long double x Bedeutung x ist eine normale Gleitkommazahl. Typischerweise eine 4-Byte-Zahl (3.4E+/-38 (7 Ziffern)). x ist eine Gleitkommazahl doppelter Genauigkeit. Typischerweise eine 8-Byte-Zahl (.7E+/-38 (5 Ziffern)). x ist eine Gleitkommazahl besonders hoher Genauigkeit. Typischerweise eine -Byte-Zahl (.2E+/-4932 (9 Ziffern)). Zur Eingabe von Gleitkomma-Zahlenwerten verwendet man die technischwissenschaftliche Notation mit Vorzeichen, Mantisse und Exponent (z.b. - 3.456e-78). Es wird kein Komma, sondern der Dezimalpunkt verwendet. Die angegebenen Zahlenwerte auf den nächsten Seiten sind implementierungsabhängig, siehe auch in float.h. Gleitkommazahlen Darstellung des Typs float im Speicher Byte 4 Byte 3 Byte 2 Byte 7 6 5 4 3 2 V Z 222298765432 9 8 7 6 5 4 3 2 Exponent Mantisse V Z 2 28 = 3.42823466 * 38 2-26 =.7549435 * -38 2 9 +2 8 +2 7 +2 6 +2 4 +2 9 +2 5 +2 4 +2 3 +2 2 +2 +2 = 524288+26244+372+65536+6384+ 52+32+6+8+4+2+ = 999 999 Grundlagen der Informatik I - Teil 3 8
Gleitkommazahlen Darstellung des Typs double im Speicher Byte 8 Byte 7 Byte 2 Byte 9 8 7 6 5 4 3 2 V 52554948 5432 9 8 7 6 5 4 3 2 Z Exponent Mantisse V Z 2 24 =.79769334862358 * 38 5-Stellen 999 999 999 999 999 2-22 = 2.225738585724e * -38 Gleitkommazahlen Darstellung des Typs long double im Speicher Abgebildet auf double; long double nur theoretisch Byte Byte 9 Byte 2 Byte 32 9 8 7 6 5 4 3 2 V 64 5432 9 8 7 6 5 4 3 2 Z Exponent Mantisse V Z 2 6384 =.897349535723765 * 4932 2-6382 = 3.362343293563e * -4932 8-Stellen 999 999 999 999 999 999 Grundlagen der Informatik I - Teil 3 9
Gleitkommazahlen Phänomen der Auslöschung bei der Subtraktion zweier fast gleicher Zahlen Beispiel: (a + b) + c <=> a + (b + c) a =.23456e-4 =.23456 b = =. --------------- s = a + b =.2 c = = -. --------------- s = s + c =.2 s = =.2e-4 a =.23456e-4 =.23456e-4 d = b + c =. --------------- s2 = a + d =.23456e-4 In C-Notation: Auslöschung #include <iostream.h> void main () { float a, b, c, s, s2; a =.23456e-4; b =.; c = -b; s = a + b; cout << "s = " << s << endl; s = s + c; cout << "s = " << s << endl; s2 = a; cout << "s2 = " << s2 << endl; s2 = s2 + (b + c); cout << "s2 = " << s2 << endl; } Ausgabe: s =.2 s =.235 s2 =.23456 s2 =.23456 Grundlagen der Informatik I - Teil 3 2
Speicherbedarf und Wertebereich Buchstaben Ein Computer soll nicht nur Zahlen, sondern auch Buchstaben und Text verarbeiten können. Da der Computer nur Dualzahlen kennt, muss es eine Zuordnung von Buchstaben zu Dualzahlen geben. Eine solche Zuordnung ist für die in der Datenverarbeitung am meisten verwendeten Zeichen im ASCII -Zeichensatz festgelegt. Die meisten Rechner benutzen diesen Zeichensatz, haben aber oft individuelle Erweiterungen (nationale Zeichensätze, grafische Symbole). Grundsätzlich unterscheidet man druckbare und nicht druckbare Zeichen. Druckbar sind z.b. A, B, C, Nicht druckbare Zeichen haben meist eine Steuerfunktion bzw. andere Sonderfunktion. Dafür sind im ASCII-Zeichensatz Kürzel festgelegt, die aber nicht alle erklärt werden. EOT = End of Tape = Bandende, ACK = Acknowledge = akzeptiert : ASCII = American Standard Code for Information Interchange Grundlagen der Informatik I - Teil 3 2
Buchstaben Wichtig sind die Bildschirm-Steuerzeichen, in deren Bezeichnung (z.b. Wagenrücklauf) deutlich der Ursprung aus dem Fernschreiber-Bereich anzumerken ist: BS = Backspace = Rückwärtsschritt HT = Horizontal Tab = Horizontaler Tabulator LF = Linefeed = Zeilenvorschub VT = Vertical Tab = Vertikaler Tabulator FF = Formfeed = Seitenvorschub CR = Carriage Return = Wagenrücklauf SP = Space = Leerzeichen Der ASCII-Zeichensatz nutzt nur die Hälfte der in einer 8-Bit- Darstellung möglichen Zeichencodes. Rechnersysteme nutzen üblicherweise auch den freien Bereich für Sonderzeichen (Umlaute, Grafikzeichen). Diese sind aber nicht normiert, daher werden sie hier nicht weiter aufgelistet. Der ASCII - Zeichensatz 2 3 4 5 6 7 NUL DLE SP @ P ' p SOH DC! A Q a q 2 STX DC2 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB 7 G W g w 8 BS CAN ( 8 H X h x 9 HAT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS, < L \ l D CR GS - = M ] m } E SO RS. > N ^ n ~ F SI US /? O _ o DEL Grundlagen der Informatik I - Teil 3 22
ASCII - Zeichensatz Das Zeichen 'A' hat den Zeichencode (4) 6 = 65. Das Zeichen 'z' hat den Zeichencode (7a) 6 = 22. Der Rechner speichert nicht das Zeichen, sondern den Zahlencode - also eine Zahl. Für den Rechner besteht kein Unterschied zwischen Zeichen und dem zugehörigen Zeichencode. Konsequenterweise verwendet C deshalb auch den Integer-Datentyp zur Ablage von Buchstaben. Da ein Code des ASCII - Zeichensatzes in den kleinsten verfügbaren Integer-Datentyp hineinpasst, verwendet man den Begriff char (engl. character = Buchstabe). Der Datentyp char beinhaltet also Zahlen und Buchstaben. Daher kann man mit Buchstaben auch rechnen. Beispiel: Addiert man zu 'A' eine hinzu, erhält man das auf 'A' folgende Zeichen also ein 'B'. Daher kann man Buchstaben auch der Größe nach vergleichen; wichtig für Sortieraufgaben. Buchstaben Schreibweise in der C-Programmierumgebung in Hochkommata, um es von Variablen unterscheiden zu können. char buchstabe = 'a';... if ( buchstabe <= 'z' )... Gilt nur für druckbare Zeichen. Ersatzdarstellung für die Nicht-druckbaren Zeichen. Dazu "opfert" man ein druckbares Zeichen den Backslash "\" als Indikator für ein Sonderzeichen. Der Backslash heißt daher auch Escape - Zeichen. Zusammen mit den nachfolgenden Zeichen spricht man von einer Escape - Sequenz. Grundlagen der Informatik I - Teil 3 23
Escape - Sequenz Escape-Sequenz \n \t \v \b \r \f \' \" \a \? \\ \zzz \xzz Bedeutung neue Zeile horizontaler Tabulator vertikaler Tabulator backspace (Rückschritt, Löschen) carriage return (Wagenrücklauf) form feed (Seitenvorschub) einfaches Hochkomma doppeltes Hochkomma bell (Klingelzeichen) Fragezeichen backslash Oktaldarstellung des Zeichencodes (z =,,, 7) Hexdarstellung des Zeichencodes (z =,,, 9, a,, f) Escape - Sequenz Beispiele: '\n' /* ein Zeilenvorschub Hex-Code: a */ '\t' /* ein Tabulatorzeichen Hex-Code: 9 */ '\\' /* ein Backslash Hex-Code: 5c */ '\'' /* ein einf. Hochkomma Hex-Code: 27 */ '\' /* ein A (Oktalcode) Hex-Code: 4 */ '\x4' /* ein A (Hex-Code) Hex-Code: 4 */ Auch wenn bis zur Darstellung bis zu 4 Zeichen verwendet werden, handelt es sich immer nur um Zeichen (-Byte- Zeichencode). Beispiel Grundlagen der Informatik I - Teil 3 24
Formatierte Ausgabe Manipulatoren werden in den Ausgabestrom eingefügt. Sie bewirken keine Ausgabe, sondern bewirken eine Zustandsänderung des Ausgabestroms Folgende Ausgabemanipulatoren existieren: Manipulator dec hex oct flush endl setw (int n) setprecision (int n) setfill (char c) Bedeutung dezimale Ausgabe (default) hexadezimale Ausgabe oktale Ausgabe Leeren des Puffers auf das Ausgabemedium Ausgabe von '\n' und Aufruf von flush n ist minimale Ausgabebreite (nur für unmittelbar folgende Ausgabe, wird danach auf gesetzt) n ist die Ausgabegenauigkeit c ist Füllzeichen beeinflusst Z Z Z R Aussagenlogik Unter Aussage versteht man einen Satz, der entweder wahr oder falsch ist. Beispiele für Aussagen: Darmstadt liegt in Hessen. Darmstadt hat 2. Einwohner. Beispiele für "Keine"-Aussagen: Guten Tag, meine Damen und Herren, guten Morgen, liebe Studenten! Wie spät ist es? Bei der Programmierung interessiert man sich nur mit präzise formulierten Aussagen wie z.b. wert < oder a + b > c. Komplexere Aussagen: Darmstadt liegt in Hessen und hat 2. Einwohner. Das ist richtig, wenn beide Teilaussagen richtig sind. Das Wort "und", mit dem die beiden Teilaussagen verbunden sind, bezeichnet man als Junktor. Im Folgenden interessiert nicht der Inhalt der Aussagen, sondern eher dass allgemeine Verständnis für die Aussagenlogik bzw. für die Boole'sche Algebra. Grundlagen der Informatik I - Teil 3 25
Aussagenlogik - Festlegungen Wahrheitswerte: "wahr" bzw. "falsch" Symbole: "" bzw. "" Aussagen (ohne Inhalt): a, b, c "a ist wahr " heißt dann "a = " Umgekehrt: "a = " heißt "a ist falsch" Die Abhängigkeit einer Gesamtaussage von ihren Teilaussagen drückt man mathematisch korrekt durch eine Funktion f(a, b, c) aus. Man spricht auch von Schaltalgebra. Man nennt dies eine boolesche Funktion. Die Funktionstabelle einer booleschen Funktion bezeichnet man als Wahrheitstafel. Junktoren heißen logische Operatoren. Binäre (Boolesche) Verknüpfungen Schaltzeichen Symbol Wahrheitstabelle Schaltfunktion, Benennung, Gleichung Beschreibung Gleichung in C-Notation a b & x a b x UND-Funktion (Konjunktion) x = a ^ b Ausgang nur dann -Zustand, wenn sich beide Eingänge im -Zustand befinden. x = a && b; a b x a b x ODER-Funktion (Disjunktion) x = a ^ b Ausgang nur dann -Zustand, wenn sich mindestens ein Eingang im -Zustand befindet. x = a b; Grundlagen der Informatik I - Teil 3 26
Binäre (Boolesche) Verknüpfungen Schaltzeichen Symbol Wahrheitstabelle Schaltfunktion, Benennung, Gleichung Beschreibung Gleichung in C-Notation a b x a x NICHT-Funktion (Negation) x = a Ausgang nur dann -Zustand, wenn sich der Eingang im -Zustand befindet. x =!a; a b = x a b x Antivalenz-Funktion (Exklusiv-ODER) x = (a ^ b) (a ^ b) ^ x = (a b) ^ (a ^ b) ^ Ausgang nur dann -Zustand, wenn sich beide Eingänge in unterschiedlichen Zuständen befinden. x = (a b) &&!(a && b); Logische Operatoren in C boolesche Algebra C-Programm Bedeutung! && logische Negation logisches UND logisches ODER In der Booleschen Algebra wurde gezeigt, dass diese drei Operatoren ausreichend sind, um alle booleschen Funktionen zu berechnen. In C gibt es keinen Wert bool, der nur die Werte wahr oder falsch annehmen kann. Der Wert wird als "falsch" bewertet. Alle Werte!= wird als "wahr" bewertet. Es gilt auch hier:! wird vor && und && vor ausgewertet. In C++ gibt es den Wert bool, der nur die Werte false und true annehmen kann. Er hat die Größe Byte (in älteren Version vom Typ int = 2 4 Byte). Grundlagen der Informatik I - Teil 3 27
Logische Operatoren in C Es ergeben sich die folgenden Wahrheitstabellen: a!a a b a && b a b a b Beispiel Bit - Operationen Obwohl auf einem Rechner nur einzelne Bytes adressiert werden können, kann man auch auf einzelne Bits eines Bytes zugreifen. Dazu verwendet man so genannte Bit-Oprationen. Diese können nur auf ganzzahlige Operanden angewandt werden und erlauben die Manipulation einzelner Bits in den Daten. Im Einzelnen handelt es sich um folgende Operatoren: ~ bitweises Komplement (Einerkomplement) & bitweises "und" bitweises "oder" ^ bitweises "entweder oder" (exklusives oder, xor) << bitshift nach links >> bitshift nach rechts Die 4 erstgenannten sind eng verwandt mit den logischen Operatoren, die bereits behandelt wurden. Grundlagen der Informatik I - Teil 3 28
Grundlagen der Informatik I - Teil 3 29 Bit - Operationen x y x y x & y y x Das bitweise "und" zweier Zahlen (x & y): Das bitweise "oder" zweier Zahlen (x y): ~x Das bitweise Komplement einer Zahl (~x): x Bit - Operationen y x 2 n x >> n x << n 2 n x Das bitweise Verschieben um n-bit nach links (x << n): Das bitweise Verschieben um n-bit nach rechts (x >> n): x ^ y Das bitweise "entweder oder" zweier Zahlen (x ^ y): x
Bit - Operationen Bei shift nach links wird immer nachgeschoben. Falls der Operand vom Typ unsigned int ist, wird bei shift nach rechts immer nachgeschoben. Ist der Operand vorzeichenbehaftet, lässt der Standard es offen, ob oder das höchstwertige Bit (Vorzeichenbit) nachgeschoben wird. Verwendung finden diese Operatoren vorwiegend in der maschinennahen Programmierung, da dort häufig ganz bestimmte Bitmuster erzeugt werden müssen oder gefragt wird, ob in einem Bitmuster ein bestimmtes Bit gesetzt ist. Mit Hilfe solcher Operatoren kann man z.b. 8 ja/nein - Informationen (so genannte Flags) in einer char-variablen (pro Flag ein Bit) platzsparend unterbringen oder gezielt manipulieren. Beispiele: Setze das n-te Bit in x: x = x ( << n) Lösche das n-te Bit in x: x = x & ~( >> n) Invertiere das n-te Bit in x: x = x ^ ( << n) Bit - Operationen Prüfe, ob das n-te Bit in x gesetzt ist: if ( x & ( << n) ) Beispiel Grundlagen der Informatik I - Teil 3 3