|
|
|
|
|
|
|
|
| .. Regeln für Zahlen im Quelltext | ||
|
|
||
|
|
Zahlenangaben im Quelltext Zahlen die im Quelltext eines Programms auftauchen, ordnet der Compiler bei der Übersetzung des Quelltextes aufgrund ihrer Schreibweise dem Fließkomma- bzw. dem Binär- (Ganzzahlen) format zu. Er speichert dann die Zahlen im Maschinencode des Programms. Erst zur Laufzeit des Programms werden die Zahlen den Variablen zugewiesen, also in deren Speicherbereiche kopiert. Weiß man nicht, wie der Compiler zwischen Ganzen- und Fließkommazahlen unterscheidet, kann es dann zu unverhofften Resultaten kommen. |
|
|
|
|
1. Beispiel: a = 4 / 5 * 22 |
|
|
|
|
Noch vor der Übersetzung berechnet der Compiler den Ausdruck 4 / 5 * 22. Er interpretiert die Zahlen als Ganzzahlen und kommt zu dem Ergebnis 0, denn 4:5 = 0 REST 4 und 0 * 22 = 0. Er speichert das Ergebnis 0, je nach Typ von a, im Programmcode, so dass a während der Laufzeit den Wert 0 annimmt. |
|
|
|
|
2. Beispiel: a= 4. / 5. * 22 |
|
|
|
|
Auch hier rechnet der Compiler vor der Übersetzung. Diesesmal jedoch mit Fließkommazahlen. Er kommt zu dem Ergebnis 17.6. Ist a vom Typ int, wandelt der Compiler die 17.6 zu der Ganzzahl 17 und legt sie im Programmcode ab. Ist a vom Typ float oder double so wird 17.6 als Fließkommazahl gespeichert. Dem Typ von a entsprechend, kann a zur Laufzeit also den Wert 17 oder den Wert 17.6 besitzen. |
|
|
|
|
|
|
|
|
|
Zusammenfassung:
Der
Compiler wählt das ..
...
Binärformat
(Ganzzahlformat) bei der Berechnung von Zahlen ohne
Dezimalpunkt.
...
Fließkommaformat bei Zahlen mit einem Dezimalpunkt
... ... im letzten Fall wandelt er die Zahlen in den Typ double. Durch Anfügen eines Suffixes kann der Programmierer einen anderen Typ erzwingen .. |
|
|
|
|
12.f oder 12.F |
der Compiler wandelt die Zahl 12 zum Typ float |
|
|
|
12.l oder 12.L |
der Compiler wandelt die Zahl 12 zum Typ long double |
|
|
|
Binärformat bei Zahlen ohne Dezimalpunkt ... ... ohne weitere Angabe wandelt der Compiler Zahlen in den kleinst möglichen Typ des Binärformats. ... ... durch Anfügen eines Suffixes kann der Programmierer folgende Typen erzwingen. |
|
||
|
|
12u oder 12U |
unsigned int oder unsigned long int, je nach Wert der Zahl |
|
|
|
|
12l oder 12L |
long int oder unsigned long int, je nach Wert der Zahl |
|
|
|
|
12ul oder 12UL |
unsigned long int in jedem Fall. auch uL oder Lu oder LU .. möglich |
|
|
|
|
Zahlen des Binärformats können im Quelltext neben ihrer dezimalen Schreibweise auch oktal, hexadezimal, oder als Zeichen bzw. Doppelzeichen zwischen Hochkommata, angegeben werden. Der Compiler wandelt alle Schreibweisen in das Binärformat bevor er die Zahlen in den Programmcode einfügt. Bei Zeichen sucht der Compiler sogar in seiner ASCII-Tabelle nach dem ASCII-Code des Zeichens, der ja auch eine Zahl ist, bevor er diese Zahl des Binärformats in den Programmcode übernimmt. |
|
||
|
|
dezimale Zahlen |
|
|
|
|
|
1234 |
Zahlen die mit einer Ziffer ungleich 0 beginnen, werden als Dezimalzahlen (Ziffern 0-9, Basis 10) bewertet und in das Binärformat gewandelt |
|
|
|
|
|
|
|
|
|
|
01234 |
|
|
|
|
|
hexadezimale Zahlen |
|
|
|
|
|
0x1234 |
|
|
|
|
|
ASCII-Code Zahlen |
|
|
|
|
|
'1' |
|
|
|
|
|
|
|
||
|
|
Erzeugung von Konstanten |
|
||
|
|
Konstante Zahlen können auf zwei Wegen einem Bezeichner zugeordnet werden. Der Bezeichner kann dann im Quelltext überall dort verwendet werden, wo die konstante Zahl benötigt wird. |
|
||
|
|
3. Beispiel: const int GELB = 0x0E |
|
||
|
|
Im
Quelltext wird GELB als Bezeichner vom Typ Integer erklärt.
GELB wird der nicht veränderbare Wert 0x0E = 14 zugeordnet.
Die Anweisung wirkt nur im jeweiligen Anweisungsblock { } also
lokal, wenn sie dort definiert wurde. Steht sie außerhalb
einer Funktion wirkt sie in allen Programmteilen. Man sagt dann,
GELB sei global erklärt.
Dieser Art erklärte Konstante können nach der erstmaligen Belegung mit einer Zahl nicht mehr verändert werden. Ein zweiter Versuch innerhalb des Quelltextes GELB einen Wert zuzuweisen, wie GELB = 0x1F, würde zu einer Fehlermeldung des Compilers und zu einem Abbruch des Übersetzungsvorganges führen. |
|
||
|
|
4.Beispiel: #define GELB 0x0E |
|
||
|
|
Hier wird die Präprozessordirektive #define dazu verwendet eine Konstante zu formulieren. Der Präprozessor ist ein besonderer Programmteil des Compilers. Er ordnet dem Literal GELB die Bedeutung von 0x0E zu und fügt bei der Compilation an allen Stellen an denen GELB steht 0x0E ein. Dann erst übersetzt der Compiler den Quelltext in die Maschinensprache. Die Präprozessordirektive #define wirkt genau von der Position an, in der sie sich im Quelltext befindet und eine zweite Zuweisung zum Literal GELB im gleichen Quelltext führt im Maximalfall zu einer Warnung des Compilers. Genau dies ist der Grund, warum #define zur Erklärung von Konstanten nicht so beliebt ist. |
|
||
|
|
|
|
||
|
|
Die Modulo-Division In der Programmiersprache C steht das Zeichen %, wenn man es als Rechenanweisung benutzt, für die Modulodivision. Bei dieser wird der Rest einer Division als Ergebnis betrachtet. |
|
||
|
|
3. Beispiel: a = 4 % 5 * 22 |
|
||
|
|
Noch vor der Übersetzung berechnet der Compiler den Ausdruck 4 % 5 * 22. Er interpretiert die Zahlen als Integerzahlen und kommt zu dem Ergebnis 88, denn 4 mod 5 = 0 REST 4 und 4 * 22 = 88. Er speichert das Ergebnis 88 je nach Typ von a im Programmcode, so dass a während der Laufzeit den Wert 88 annimmt. |
|
||
|
|
||||
.de