Sie sind auf Seite 1von 38

Einfhrung in die Programmierung Vorlesung 4 W I S S E N 1

T E C H N I K

L E I D E N S C H A F T

Einfhrung in die Programmierung


DI Dr. Christian Safran, IICM DI Michael Steurer, IICM Univ.-Prof. DI Dr. techn. Frank Kappe, IICM

www.tugraz.at

Einfhrung in die Programmierung Vorlesung 4 2

Inhalt Teil 4:
Funktionen (Einfhrung Teil 2)
"! Die Funktion scanf

Bits & Bytes


"! "! "! "! "! "! Experimente Oktal- und Hexadezimalzahlen Ganzzahlen-Darstellung im Computer Bit-Operationen Gleitkommazahlen und ihre Tcken Buchstaben und andere Zeichen

Zur Effizienz von C-Programmen


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 3

call-by-Value vs. call-by-reference


Normalerweise werden Variablen "by-value" bergeben
"! der Inhalt wird kopiert "! nderungen in der Funktion bewirken keine nderung auerhalb

Mit dem & (address-of) Operator kann man Variablen als "by-reference" bergeben
"! die lokale Variable der Funktion ist dieselbe wie die des Aufrufers "! nderungen in der Funktion bewirken auch nderung auerhalb "! dadurch kann eine Funktion mehr als einen Wert liefern

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 4

Die Funktion "scanf"


Liest Parameter in bestimmten Format ein
"! Sozusagen das Gegenteil von printf

scanf(<format>,&<parameter>, ...); Format string wie bei printf <parameter> mssen by-reference bergeben werden Wichtig: Anzahl und Typ der Parameter mssen mit format-string bereinstimmen !!!
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 5

Beispiel fr scanf
.. .. 15 16 17 18 19 20 21 22 23 24 25 26 [function sum as before] int main() { int from = -1; int to = -1; printf("Please enter two numbers, e.g.'10 - 25'\n"); scanf("%d - %d", &from, &to); if (from == -1 || to == -1) return 1; // error printf("The sum from %d to %d is %d.\n", from, to, sum(from, to)); return 0; // success }

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 6

Nochmal zurck zu unserer "sum"-Funktion

1 2 3 4 5 6 7 8

// computes the sum of the numbers from "from" to "to" int sum(int from, int to) { int result; for (result = 0; from <= to; from++) result += from; return result; }

sum(1, 10000) = 50005000 sum(1, 70000) = -1844932296 ???


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 7

Experimente mit int, float, double

Modifizierte Programme sum_float.c, sum_double.c Resultate:


Summe von:
1 - 10000 1 - 100000 1 - 1000000000

sum.c
50005000 705082704 -243309312

sum_float.c
50009072 5000086528 Endlosschleife!

sum_double.c
50005000 5000050000 500000000995475712

!! Kann man dem Computer berhaupt trauen ?

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 8

Bits
Alle Informationen (insbesondere auch Zahlen) werden im Computer als "Bits" gespeichert/verarbeitet/ bertragen/... 1 Bit ist die kleinste Einheit der Information und kann 2 Zustnde annehmen, die als 0 und 1 bezeichnet werden Technisch knnen diese Zustnde unterschiedlich dargestellt werden, z.B.:
"! Spannung liegt an oder nicht "! Strom fliet oder nicht "! Licht an oder aus "! Magnetisierung in Nord-Sd- oder Sd-Nord-Richtung "! Schwarz oder weiss DI Dr. Christian Safran, IICM "! ...

Einfhrung in die Programmierung Vorlesung 4 9

Bytes
Um mehr Information als 2 Zustnde darzustellen, werden mehrere Bits zusamengefasst:
"! "! "! "! "! "! "! 2 bits : 22 = 4 mgliche Zustnde (00,01,10,11) 3 bits : 23 = 8 mgliche Zustnde (000,001,010,011,100,101,110,111) 4 bits : 24 = 16 mgliche Zustnde (...) ... 8 bits : 28 = 256 mgliche Zustnde ... n bits : 2n mgliche Zustnde

Eine Gruppe von 8 Bits bezeichnet man als Byte


"! Nach ISO-Standard: Octet
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 10

Tabelle: Wichtige Potenzen von 2


n 1 2 3 4 5 6 7 8 9 10 11 2n 2 4 8 16 32 64 128 256 512 1.024 2.048 =1K 20 24 30 31 32 1.048.576 = 1 M 16.777.216 1.073.741.824 = 1 G 2.147.483.648 4.294.967.296 n 12 13 14 15 16 2n 4.096 8.192 16.384 32.768 65.536

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 11

Oktalzahlen
Lngere Bit-Gruppen sind etwas lang zu schreiben, z.B.:
01|100|001|111|010|111|011|010|101|111|001 (32 bits)
"! kann man krzer als Oktal-Zahl 14172732571 schreiben

dabei bilden jeweils 3 bits eine Ziffer:


000 = 0 100 = 4 001 = 1 101 = 5 010 = 2 110 = 6 011 = 3 111 = 7

von hinten beginnend in 3-er Gruppen


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 12

Hexadezimalzahlen
hnlich wie Oktalzahlen, aber 4 bits zusammengefasst
0000 0100 1000 1100 = = = = 0 4 8 C 0001 0101 1001 1101 = = = = 1 5 9 D 0010 0110 1010 1110 = = = = 2 6 A E 0011 0111 1011 1111 = = = = 3 7 B F

z.B.: 0110|0001|1110|1011|1011|0101|0111|1001 = 61EBB579 (hex)


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 13

Ganzzahlkonstanten in C

Hexadezimalzahlen beginnen mit 0x Oktalzahlen beginnen mit 0 Alles andere sind Dezimalzahlen

Dezimalkonstanten nicht mit fhrenden Nullen schreiben!


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 14

Umrechnungen von Zahlendarstellungen


Dezimalzahl: 3762 = 3*103 + 7*102 + 6*101 + 2*100 Oktalzahl: 03762 = 3*83 + 7*82 + 6*81 + 2*80 = 2034 Hexadezimalzahl: 0x37A2 = 3*163 + 7*162 + 10*161 + 2*160 = 14242
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 15

Zahlendarstellung von Ganzzahlen:


Die bits werden als Stellen einer Binrzahl interpretiert

z.B.:

01011001

= 0*27 + 1*26 + 0*25 + 1*24 + 1*23 + 0*22 + 0*21 + 1*20 = =


DI Dr. Christian Safran, IICM

64

+ 16 89

+8

+1

Einfhrung in die Programmierung Vorlesung 4 16

Beispiel: "Computerfreak-Uhr"

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 17

Mit Binrzahlen ist einfach zu rechnen


!! Zum Vergleich Dezimalsystem: 200 Input-Mglichkeiten, 20 Output-Mglichkeiten !! Beispiel: Binr Dezimal 0101 + 0111 =1100 5 +7 = 12

Additions-Regeln fr x = a + b (ci = bertrag der i-ten Stelle)


Inputs ci1

Outputs bi 0 1 0 1 0 1 0 1 ci 0 0 0 1 0 1 1 1 xi 0 1 1 0 1 0 0 1

ai 0 0 1 1 0 0 1 1

0 0 0 0 1 1 1 1

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 18

Negative Zahlen: 2-Komplement


Alle Bits invertieren (1-Komplement), dann +1 z.B.: +13 = 00001101 (8 bits) invertiert = 11110010 +1 = 11110011 (= -13) MSB (most significant bit) ist das Vorzeichen (1 = negativ) Vorteil des 2-Komplements: Addition verluft ganz normal:
Binr 11110011 +00011001 =00001100
DI Dr. Christian Safran, IICM

Dezimal -13 + 25 = 12

Einfhrung in die Programmierung Vorlesung 4 19

Zahlenbereiche
Allgemein: Wertebereich bei n bits:
"! unsigned: 0 bis 2n-1 "! signed: -2n-1 ... 2n-1 - 1

C - Datentyp
(signed) char unsigned char (signed) short unsigned short (signed) int unsigned int
DI Dr. Christian Safran, IICM

bits
8 8 16 16 32 32

kleinste Zahl
-128 0 -32768 0 -2.147.483.648 0

grte Zahl
127 255 32767 65535 2.147.483.647 4.294.967.295

Einfhrung in die Programmierung Vorlesung 4 20

berlauf / Unterlauf (overflow / underflow)


Problem: Wird bei Ganzzahl-Arithmetik nicht erkannt! z.B. unsigned short:
0xFFFF + 0x0001 = 0x0000 (65535 + 1 = 0) !!

z.B. signed short:


0x7FFF + 0x0001 = 0x8000 (32767 + 1 = -32768) !!

Der Programmierer ist dafr verantwortlich, dass nichts passiert !!!


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 21

Bit-Operatoren: & | ^ ~
& (bitweises AND)
"! z.B. 0101 & 0011 = 0001

| (bitweises OR)
"! z.B. 0101 | 0011 = 0111

^ (bitweises XOR)
"! z.B. 0101 ^ 0011 = 0110

~ (bitweises NOT)
"! z.B. ~0101 = 1010
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 22

Hufige Anwendung: "Flags"


Einzelne Bits mit spezieller Bedeutung, z.B. bei:
"! "! "! "! Hardware-Treibern Netzwerk-Programmierung File-Formaten Kompression/Dekompression

Beispiel:
unsigned char disk_status; // status of hard disk unsigned char disk_spins = 0x20; // set bit to turn on ... if (disk_status & disk_spins) // disk is turned on { ... }
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 23

Logische Zuweisungs-Operatoren &= |= ^=


Wie bei arithmetischen Operatoren, d.h.
a &= b; c |= d; e ^= f; ist dasselbe wie a = a & b; c = c | d; e = e ^ f;

Anwendung: Setzen / Lschen von bits:


unsigned char disk_status; // status of hard disk unsigned char disk_spins = 0x20; // set bit to turn on ... disk_status |= disk_spins; // turn disk on ... disk_status &= ~disk_spins;
DI Dr. Christian Safran, IICM

// turn disk off

Einfhrung in die Programmierung Vorlesung 4 24

Bit-Shift Operatoren << >> <<= >>=


<< schiebt Inhalt des linken Operanden um den Inhalt des rechten Operanden Bits nach links; >> nach rechts z.B.: 00010110 << 2 = 01011000 <<= und >>= wie blich Beispiele in C:
unsigned char hi_byte = 0x12; unsigned char lo_byte = 0x34; unsigned short word = (hi_byte << 8) | lo_byte; signed int my_number = 100; signed quarter = 100 >> 2; my_number = -200; my_number >>= 2;
DI Dr. Christian Safran, IICM

// 0x1234

// same as (int) division by 4 // -50, sign bit is copied

Einfhrung in die Programmierung Vorlesung 4 25

Gleitkommazahlen
In Dezimaldarstellung = sogenannte "scientific notation": 1.234e12 = 1.234*1012 = 1234000000000 1.234e-12 = 1.234*10-12 = 0.000000000001234 In Binrdarstellung:
"! "! "! "! "! Basis ist 2 statt 10 Mantisse (m) und Exponent (e) als Binrzahlen Wert = m*2e 2 Vorzeichen (fr mantisse und exponent) Spezielle Werte: +0, -0, +!, -!, NaN (Not a Number)

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 26

IEEE 754 Standard

float (32 bits)


"! e = 8, f = 23 "! Wertebereich: 2-126 bis 2128 oder 1.175"10-38 bis 3.403"1038 "! Genauigkeit: 6-7 Dezimalstellen

double (64 bits):


"! e = 11, f = 52 "! Wertebereich: 2-1022 bis 21024 oder 2.225"10-308 bis 1.798"10308 " ! Genauigkeit: 15-16 Dezimalstellen DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 27

"Special Effects" von Gleitkommazahlen

3_float_effects.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 28

Probleme:
Groe und kleine Zahlen bei + und - ("cancellation")
"! Ursache fr Endlosschleife bei sum_float.c

Rundungsfehler
"! besonders bei Subtraktionen groer Zahlen, z.B. (x2 y2)

0.1 dezimal ist binr 0.00011001100110011....


"! Rundungsfehler auch bei dezimal "simplen" Zahlen

Gleitkommazahlen niemals mit == oder != vergleichen


"! Wenn notwendig: statt (x == y) besser (abs(x-y) < epsilon) "! In Kombination mit Rundungsfehler Endlosschleife in float_effects.c
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 29

Fazit
Gleitkommazahlen haben einen groen Wertebereich
"! praktisch kein berlauf / Unterlauf

Dafr aber eine Menge andere "Effekte" Nur wenn unbedingt notwendig verwenden Nie fr kaufmnnische Anwendungen Nie auf Gleichheit/Ungleichheit testen Bei Ganzzahlen auf berlauf / Unterlauf achten
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 30

Buchstaben sind auch nur Zahlen


ISO Latin-1 (druckbare Zeichen)

verschiedene "Encodings":
"! ASCII
"! (American Standard Code for Information Interchange) "! 7 bits

"!

ISO Latin-1
"! fr westeuropische Sprachen "! 8 bits

"!

Unicode, UTF-8
"! variable Lnge "! dzt. etwa 100.000 Zeichen definiert

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 31

Nicht-druckbare Zeichen im ASCII Code


die wichtigsten in C-Schreibweise:
"! "! "! "! "! "! "! \0 (\0x00) kennzeichtet das Ende eines strings \a (\0x07) Bell (piepst) \b (\0x08) Backspace (1 Zeichen lschen) \t (\0x09) Tabulator \n (\0x0A) Newline (nchste Zeile) \r (\0x0D) Return (an den Anfang derselben Zeile gehen) \e (\0x1B) Escape

"! \\ Backslash "! \" Anfhrungszeichen


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 32

Beispiel (&, <<, |, Hex-Zahlen, Zeichen)

3_print_characters.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 33

Alles eine Frage der Interpretation...


Frage: Was bedeuten diese 16 bits? 1101010100110011 Antwort: das hngt von der Interpretation ab, z.B:
"! "! "! "! "! "! die Buchstaben "3" (2 8-bit Zeichen in ISO 8859-1 Codierung) die Hexadezimal-Zahl D533 die Oktal-Zahl 152463 die Dezimal-Zahl 54579 die Dezimal-Zahl -10957 ....

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 34

Zur Effizienz von C-Programmen


Geschwindigkeits-Test auf meinem Laptop
"! Jeweils mit 1000000000 Schleifendurchlufen

Messen z.B. mit:


"! time ./sum_double "! dann durch Anzahl der Schleifendurchlufe dividieren

zum Vergleich PHP:


"! sum.php:

C ist sehr effizient; aber


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 35

Nachdenken vor dem Programmieren ist besser:

Formel (C.F. Gauss 1777-1855):


sum(1,n) = (n+1) * n/2

ist etwa n-mal so schnell wie unsere alte sumFunktion !!

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 36

3. Hausbung
Binrdarstellung und Bitoperationen "! Anwendungsbeispiel IPv4 Adressen
"! 4 Byte groe Netzwerkadresse und Netzwerkmaske "! A.B.C.D / E "! Netzwerkteil und Hostteil 127.0.0.1 / 16 = 0111 1111 0000 0000 | 0000 0000 0000 0001

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 37

3. Hausbung
Input-Datei erstellen und inkludieren Host- und Netzteil isolieren und neu zusammensetzen 0xC0A80101 / 24 (192.168.1.1) 0x0A002000 / 24 (10.0.32.0) # 10.0.32.1

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 4 38

3. Hausbung
Aufgabenstellung im Wiki
"! Halten Sie sich genau an die Anforderungen! "! Ihre Abgabe wird automatisiert getestet. "! Feedback: Anzahl der bestandenen Testflle.

Fragen von allgemeinem Interesse


"! Newsgroup tu-graz.lv.esp "! Zuerst lesen, dann posten

DI Dr. Christian Safran, IICM