Informationen zu Typenberechnungen



  • Hallo zusammen,
    Ich suche grad verzweifelt im Netz nach einer Seite, die mir etwas darüber verrät, wie Typenberechnung in C funktioniert.

    Beispiel:

    int var1;
    char var2;
    

    Das Ergebnis von var1+var2 ergibt welchen Typ? Int oder char?

    Das ist jetzt nur ein einfaches Beispiel. 🙂 Ich suche irgend eine Seite, die sich etwas umfassender mit diesem Thema beschäftigt. Hat jemand einen Tip?

    Danke und Gruß,
    Nils



  • Immer den "größeren" Typ, in diesem Fall also int.

    MfG SideWinder



  • Ja, danke, aber das ist mir schon klar. Gibt aber kompliziertere Fälle.

    **char v1;
    double v2;
    

    Was wäre denn dann ((v1 && v2) || 27)

    Das macht zwar keinen Sinn, wird aber kompiliert. Deshalb suche ich ganz allgemeine Angaben darüber, wie der ANSI C Compiler sowas auswertet.

    Gruß,
    Nils



  • Hallo,

    im folgenden zitiere ich aus dem Buch "Programmieren in C" von Kernighan und Richie! 😃

    *Typenumwandlungen

    Hat ein Operator Operanden verschiedenen Typs, dann werden ihre Werte nach einer kleinen Anzahl von Regeln in einen gemeinsamen Datentypumgewandelt. Im allgemeinene finden implizit nur soloche Typenumwandlungen statt, die einen schmöleren Operanden in einene breiteren umwandeln ohne dabei Information zu verlieren, wie etwa die Umwandlung eines ganzzhaligen Werts in einen Gleitpunktwert in einem Ausdruck wie f+i. Sinnlose Ausdrücke, wie etwa ein float-Wert als Vektorindex, sind verboten. Ausdrücke, die zu Informationsverlust führen könnten, wie die Zuweisung eines längeren IntegerTyps an einen Kürzeren oder eines Gleitpunkttyps an einen Integer-Typ können eine Warnung hervorrufen, aber sie nsind nicht illegal.*

    Ich meine, das in diesem Buch eine recht ausführliche Beschreibung von Operationen mit Operanden unterschiedlichen Typs vorhanden ist.
    Die ISBN lautet: 3-446-15497-3. Das Buch lohnt sich!

    Chiao



  • TheNils schrieb:

    Ja, danke, aber das ist mir schon klar. Gibt aber kompliziertere Fälle.

    **char v1;
    double v2;
    

    Was wäre denn dann ((v1 && v2) || 27)

    Das macht zwar keinen Sinn, wird aber kompiliert. Deshalb suche ich ganz allgemeine Angaben darüber, wie der ANSI C Compiler sowas auswertet.

    Gruß,
    Nils

    Was ist daran kompliziert? Beim Vergleich mit && wird double verwendet und beim Vergleich mit || auch, da ja beim ersten Ergebnis ein double rauskommt und 27 ein integer ist. Dein **char ist übrigens genauso groß wie ein unsigned int und ein int hängt normalerweise vom System ab, für das man kompiliert. Bei 16Bit z. B. ist ein int nur 2 Byte (= 16Bit) groß, bei 32Bit sind es schon 4 Byte.



  • AJ schrieb:

    Was ist daran kompliziert? Beim Vergleich mit && wird double verwendet und beim Vergleich mit || auch, da ja beim ersten Ergebnis ein double rauskommt und 27 ein integer ist.

    Vielleicht ist es doch nicht ganz so leicht. Bei && werden die Operanden überhaupt nicht umgewandelt, sondern mit 0 verglichen. Man könnte auch sagen, dass sie nach _Bool umgewandelt werden, aber der Standard spricht anders. Das Ergebnis ist int, und zwar entweder 0 (für falsch) oder 1 (für wahr).



  • @Bashar
    Oh, stimmt. Mein Fehler. Hab nicht sonderlich auf die Operanden acht gegeben. Das kommt davon, wenn man viele andere Sachen im Kopf hat. 😞

    Recht kompliziert wärs aber trotzdem nicht ;).


Anmelden zum Antworten