Typumwandlung

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Typumwandlung

    hallo leute,
    ich beschäftige mich gerade mit typen und wann eine typumwandlung stattfindet. kennt sich da wer aus? komme mit folgendem nicht wirklich zurecht!! danke schon mal...

    char ch; int i; float f; double d; char *cp; int *ip; float *fp; double *dp;

    f = f + i + ch // resultierender Typ=float und Typumwandlung bei Zuweisung=nein
    d=ch+0.5f+f // resultTyp=double und Typ/Zu=nein
    fp=0 // resultTyp= float * und Typ/Zu=nein
    ip=(int *) 0 //resultTyp=int und Typ/Zu=ja
    dp= &dp +7 //resultTyp=double und Typ/Zu=ja
    cp=&ch +'1' //resultTyp=char und Typ/Zu=ja

    sind meine vermutungen richtig? wäre echt klasse, wenn mir da jemand helfen könnte!! danke
  • Eigentlich sind die Regeln für die automatische Typumwandlung ganz einfach. Aber vorweg: es immer sinnvoll, die Wandlung zum gewollten Zieldatentyp explizit hinzuschreiben oder möglichst erst gar keine Datentypen zu mischen. Dann gibt es im Zweifel auch eine Warnung, wenn man mal daneben liegt.

    Die Regeln:

    es gibt eine festgelegte Reihenfolge der Typen (und die ist bei C++ anders als bei C):
    short -> int -> long -> float -> double -> long double
    char und bool gehen jeweils zu int (Abweichung gegenüber C).

    Bei Rechnungen wird bei Konflikten immer der Datentyp benutzt, der in obiger Liste weiter rechts steht.
    Also: 5 / 2 liefert 2 (beide Typen sind int, also ist das Ergebnis int).
    Aber 5 / 2.0 liefert 2.5 (2.0 ist ein double, also wird mit double gerechnet).

    Ganze Zahlen ohne Zusatz sind immer vom Typ int, Fließkommazahlen ohne Zusatz sind double.

    Der Zuweisungsoperator = konvertiert immer in den Datentyp der Zielvariablen. Gehen dabei Stellen verloren, erzeugt ein guter Compiler eine Warnung. Bei der Konvertierung spielt die Reihenfolge der Operatoren und ihre Prioritäten eine wichtige Rolle:

    float f;
    f = 5 + 2 / 4.0;
    f = 5 / 2 + 4.0;

    Erste Variante: es wird zunächst 2 / 4.0 gerechnet und somit als double 0.5 ermittelt, da 4.0 ein double ist. Dann die Addition 5 + 0.5 = 5.5 ebefalls als double. Am Schluß wird nach float gewandelt, wobei aber nix passiert.

    Zweite Variante: zuerst 5 / 2 (beide int), liefert also 2. Dann die Addition: 2 + 4.0 = 6.0 (double). Zum Schluß wieder nach float wandeln.

    Grüße
    Michael
  • Bei Pointern gibt es in C++ eine ganz einfach Regel (ebenfalls abweichend gegenüber C): sie werden niemals konvertiert. Hier ist immer eine explizite Konvertierung nötig. Das betrifft sogar gleiche Datentypen, die aber andere Namen haben (über typedef-Anweisungen).

    Bei den Zieldatentypen (also Zugriff mit *zeiger) gilt das gleiche wie bei allen anderen Konvertierungen.

    Also:
    int a;
    int *za = &a;
    *za = 15.4; # kein Problem

    Aber:
    long *zl;
    zl = za; # geht nicht da Zeiger auf long nicht gleich ist wie Zeiger auf int

    *zl = *za; # das ginge aber wieder, da hier ja die Werte und nicht die Zeiger kopiert werden

    Grüße
    Michael
  • Wozu geht bool eigentlich in C?
    Verwende einige kleine Sauereien mit booleans und Multiplikationen,...
    nAlignment * (nSize % nAlignment + 1 * (nSize % nAlignment > 0))
    Wäre das C konform?
  • In C gilt:

    (bool, char) -> short -> ....

    Bool und Char sind ein Byte-Große Datentypen (obwohl bei Bool ja eigentlich sogar ein Bit langen würde) und insbesondere char wird in C auch gerne so verwendet.

    Dank der internen Speicherausrichtung auf Wortgrenzen werden aber meist doch 4 Byte benutzt (wie beim int / long in 32-Bit-Systemen).

    C++ orientiert sich mehr an der Logik der Verwendung, und da sind Zeichen und Zahlen nunmal was anderes (wenn auch ineinander konvertierbar).

    Im Gegensatz zu C, bei dem zur Konvertierung gerne ein Cast benutzt wird
    (int) 'A'
    sollte in C++ einer der Cast-Operatoren zum Einsatz kommen
    static_cast<int>'A'
    reinterpret_cast<int>'A'

    Die Dinger lassen sich später im Programmcode leichter finden, wenn man sie mal ändern muss.

    Grüße
    Michael