17.01.2014 Aufrufe

Softwareentwicklung in C - ASC

Softwareentwicklung in C - ASC

Softwareentwicklung in C - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

38 4. Datentypen und Variablen<br />

Zeichen <strong>in</strong>terpretieren lässt. Auch zeigt sich bei der Berechnung des vierten<br />

Buchstaben des Alphabets <strong>in</strong> Zeile 22, dass e<strong>in</strong> Zeichen und se<strong>in</strong> <strong>ASC</strong>II-Code<br />

<strong>in</strong>tern als äquivalent zu betrachten s<strong>in</strong>d – hier wird e<strong>in</strong>fach e<strong>in</strong>e Zahl zu e<strong>in</strong>er<br />

char-Konstante addiert.<br />

Vorsicht Falle: Auch wenn, wie <strong>in</strong> unserem Programm gezeigt, gewisse Datentypen<br />

mite<strong>in</strong>ander bis zu e<strong>in</strong>em gewissen Grad kompatibel s<strong>in</strong>d, so muss<br />

man doch sehr aufpassen, dass es ke<strong>in</strong>e Probleme mit ihrem unterschiedlichen<br />

Wertebereich gibt. Overflows und Underflows s<strong>in</strong>d bei unsauberer Arbeitsweise<br />

leider sehr schnell passiert. Dies wird aber weder vom Compiler<br />

bemängelt (wie auch?) noch führt es zu Laufzeitfehlern! Es wird e<strong>in</strong>fach die<br />

entsprechende Zahl abgeschnitten! Da es sich hierbei um leider allzu häufige,<br />

wie auch um extrem schwer zu f<strong>in</strong>dende Fehler handelt, soll die Gefahr an<br />

e<strong>in</strong>em Beispiel illustriert werden (nennen wir es <strong>in</strong>tegral_error_test.c):<br />

1 // i n t e g r a l e r r o r t e s t . c − f a t a l e r r o r s that can happen with<br />

2 // i n t e g r a l datatypes .<br />

3<br />

4 char a char = ’ \ 0 ’ ;<br />

5 unsigned char a uchar = 0;<br />

6 unsigned <strong>in</strong>t a u i n t = 0;<br />

7<br />

8 ma<strong>in</strong> ( )<br />

9 {<br />

10 a uchar = ’ x ’ ;<br />

11 p r i n t f ( " a_uchar_ has the <strong>ASC</strong>II - value % u\n" , a uchar ) ;<br />

12 a u i n t = a uchar ;<br />

13 a u i n t = a u i n t + 300;<br />

14 p r i n t f ( " a_u<strong>in</strong>t_ has the value % u\n" , a u i n t ) ;<br />

15 a uchar = a u i n t ; // overflow ! !<br />

16 p r i n t f ( " after overflow a_uchar_ has the <strong>ASC</strong>II - value % u\n" ,<br />

17 a uchar ) ;<br />

18<br />

19 // signed − unsigned mix can be f a t a l :<br />

20 a uchar = 200;<br />

21 a char = a uchar ;<br />

22 p r i n t f ( " a_uchar_ has the value % u\n" , a uchar ) ;<br />

23 p r i n t f ( " a_char_ has the value % d\n" , a c h a r ) ;<br />

24 p r i n t f ( " <strong>in</strong>terpret<strong>in</strong>g a_char_ as unsigned it becomes % u\n" ,<br />

25 a char ) ;<br />

26 }<br />

Der Output, der von diesem Programm erzeugt wird, lässt schnell das Ausmaß<br />

der Katastrophe erkennen:<br />

a_uchar_ has the <strong>ASC</strong>II-value 120<br />

a_u<strong>in</strong>t_ has the value 420<br />

after overflow a_uchar_ has the <strong>ASC</strong>II-value 164<br />

a_uchar_ has the value 200<br />

a_char_ has the value -56<br />

<strong>in</strong>terpret<strong>in</strong>g a_char_ as unsigned it becomes 4294967240<br />

Wie kommt es nun zu diesen sche<strong>in</strong>bar s<strong>in</strong>nlosen Ergebnissen? Zuerst betrachten<br />

wir e<strong>in</strong>mal die Overflow-Situation:

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!