Programmieren
 
 
 
 
 
C-Grundkurs

 
 
 
 
.. explizite Typwandlung - (Typecasting)
 
 

 
 
 
 


Über die Variablen und ihre Typbezeichnungen char, int, unsigned, float usw. wurde bereits im Kapitel 'Zahlen/ Variable/ Konstante im Quelltext' berichtet. Hier wurde geschildert, dass jedem Variablentyp eine Anzahl von Speicherbytes zugeordnet ist und dass sich Integerzahlen von Fliesskommazahlen durch die Art wie sie abgespeichert werden, unterscheiden. Aus diesen Schilderungen ergibt sich, dass Rechnungen mit Variablen solange ohne Problem verlaufen, solange gleiche Speichertypen verwendet werden und die Obergrenze des Fassungsvermögens einer Variablen nicht überschritten wird.
Die Addition zweier unsignierter Integerzahlen (unsigned) verläuft also ohne Problem, solange das Ergebnis nicht grösser wird als 65535. Auch die Zuweisung von char-Rechnungen an einen integer, oder die Zuweisung von Ergebnissen aus int-Rechnungen an einen long int muss ohne Probleme möglich sein, denn die erzeugten Ergebnisse können den nächst grösseren Speichertyp nicht zum Überlaufen bringen.

Beispiel:


unsigned x = 65535;    // 0xFFFF grösster Wert
unsigned y = 65535;
long unsigned = z;
z = x * y;             // kein Problem, Ergebnis passt
                       // da < 0xFFFFFFFF


Wie schnell nachgerechnet werden kann, ergibt diese Multiplikation den Wert 4.294.836.225 was hexadezimal dem Wert FFFE0001h entspricht. Er passt also in eine Variable vom Typ long unsigned.


 

 

 


Probleme ..
.. entstehen, wenn ein Integer (int) einem Character (char) zugeordnet werden soll, oder eine Fliesskommazahl (float) einem Integer (int). Der Compiler würde sofort erkennen, dass hier ein mögliches Fehlerpotential enthalten ist. Er weiss, dass es unmöglich ist, in nur einem Byte die Werte von zwei Bytes unterzubringen oder die Nachkommastellen einer Fliesskommazahl in einer Ganzzahl aufzuheben. Er würde mit einer Meldung reagieren.
Nun ist es durchaus möglich, dass ein Programmierer eine solche Zuordnung wünscht. Weiss er beispielsweise, dass ein Wert, der in einer int-Variablen aufgehoben ist, nie über den grössten char-Wert hinauswachsen wird und möchte ihn nun in einen char-Speicher übertragen, dann stören ihn die Warnungen des Compilers.

Die Frage ist, wie kann der Programmierer dem Compiler beibringen, dass er diese Zuweisung will? ...

Ein Programmierer kann seinen Willen gegen den des Compilers durchsetzen, wenn er die Typenwandlung explizit (ausdrücklich) anweist. Dies tut er durch einen Formalismus der in der Sprache C als explizite Typwandlung bezeichnet wird ..

Beispiel 1:


unsigned x = 0x00FF;   // maximaler Wert für char 
char y;
y = (char) x;          // Inhalt unsigned nach char


Hier wird durch die explitite Typenwandlung (char) dem Compiler mitgeteilt, dass sich der Programmierer über die Gefahr bewusst ist, dass bei dieser Zuweisung, in der char-Variablen, alle Ziffern der unsigned Variablen verloren gehen, die über den Wert 0xFF hinausreichen.


 

 

 


Explizite Typenwandlung ..
.. muss immer dann angewendet werden, wenn bei einer Zuweisung die Gefahr eines Genauigkeitsverlustes ansteht, der Programmierer die Zuweisung aber dennoch durchführen will.

Beispiel 2:
Der Inhalt eines Speichers mit einer doppeltgenauen Fliesskommazahl (kleiner oder gleich 65535) soll einer Ganzzahl vom Typ unsigned zugeordnet werden. Hierbei werden die Nachkommastellen verloren gehen. Da der Programmierer aus der Fliesskommazahl aber einen Punkt auf dem Bildschirm festlegen will stört ihn das nicht. Er schreibt ..


double fliesskommazahl = 3456,1243;
unsigned ganzzahl = 0;
ganzzahl = (unsigned) fliesskommazahl;


Das Ergebnis in ganzzahl ist der Wert 3456. Die Nachkommastellen wurden ohne Rundung abgeschnitten.

Das Verfahren der expliziten Typenwandlung kann von jedem Variablentyp zu jedem anderen angewendet werden. Wenn beispielsweise ein Programmierer weiss, dass sich eine lange Ganzzahl als Adresse in dem Speicher des Rechners eignet, dann kann er die lange Ganzzahl zu einem Zeiger umwandeln. In diesem Fall lautet die explizite Typenwandlung ..

Beispiel 3:


long unsigned zahl = 0x12345678L;
char far* zeiger = 0L; 
zeiger = (char far*) zahl;       // Inhalt zahl wird
                                 // Zeiger auf char


Eine Benutzung des langen Integers zahl als Zeiger wäre auf den Widerwillen des Compilers gestossen. Die Zeile ..
char c;
c = *zahl; // geht nicht
.. hätte eine Fehlermeldung erzeugt. Hingegen wird nach der Typenwandlung von zahl in einen Zeiger ohne weiteres der Inhalt der Speicherzelle nach c übertragen, auf den der Inhalt von zahl zeigt.
c = (char far*) *zahl; // gehen beide
c = *zeiger;


 

 
www..de