Bei der Konvertierung zwischen Datentypen ist der Wertebereich der Datentypen zu beachten. Kann der Zieldatentyp den Ausgangsdatentyp nicht ohne Datenverlust aufnehmen, so werden die nicht darstellbaren Daten verworfen. So passt z.B. ein Integer in den Wertebereich eines Float, aber nicht umgekehrt, da ein Integer keinen Nachkommaanteil besitzt. Dieser würde abgeschnitten. 

Können bei einer Konvertierung Daten verloren gehen, warnt der Compiler vor dem Vorgang. Ein Expliziter Type-Cast mit (Zieldatentyp)Variable zeigt dem Kompiler, dass sich der Benutzer darüber im Klaren ist, und den Verlust der Daten in Kauf nimmt.

Vergleicht man Integer mit und ohne Vorzeichen, so ignoriert der Vergleich das Vorzeichen und prüft die Bit-weise Gleichheit der Daten. Dies kann dazu führen, dass der Vergleich fehlerhaft ausgeführt wird. Ein Cast in einen größere Datentypen, der beide Werte korrekt aufnehen kann, löst das Problem und ermöglicht einen sauberen Vergleich. 

Werden Pointer auf Variablen statt Variablen selbst verwendet, so Prüft der Compiler trotzdem den Typen. Die oben beschriebenen Regeln gelten damit auch für das Rechnen mit Pointern.

#include <stdio.h>

int main()
{
    int a = 42;
    float b = a;
    printf("b = %f\n", b);

    float c = 42.7f;
    int d = c; // warning: values of type `float` may not fit into receiver type `int`
    printf("d = %d\n", d);

    int e = 1;
    int f = 5;
    float g = e / f; // <-- sehr häufiger Fehler!
    printf("g = %f\n", g);

    float h = ((float)e) / f;
    printf("h = %f\n", h);

    double i = -1337.42;
    unsigned short int j = i; // warning: values of type `double` may not fit into receiver type `unsigned short`
    printf("j = %d\n", j);

    int k = 11;
    unsigned l = 12;
    if (k == l) { // warning: comparison between signed and unsigned integer expressions
        printf("what!?\n");
    }

    signed int m = -6;
    unsigned int n = 4294967290;
    if (n == m) { // warning: comparison between signed and unsigned integer expressions
        printf("what the hell!?\n");
    }

    long long o = m;
    long long p = n;
    if (o == p) {
        printf("what the hell, again!?\n");
    }

    int *ptr1 = &m;
    unsigned *ptr2 = ptr1; // warning: pointer targets in initialization differ in signedness
    printf("pN = %u\n", *ptr2);

    unsigned *ptr3 = (unsigned *)ptr1; // ok wegen explizitem cast
    printf("pN = %u\n", *ptr3);

    return 0;
}
Last modified: Friday, 25 May 2018, 3:28 PM