integer cast



  • hi,

    ich habe zwei datentypen T1, T2 mit sizeof(T1) < sizeof(T2)

    T1, T2 ~ integer

    was passiert bei folgendem?

    T2 a = some_T2();
    T1 b = (T1)a;
    
    T1 a = some_T1();
    T2 b = (T2)b;
    

    wird bei einem beschnitten und beim anderen mit nullen aufgefüllt?



  • Hi!

    beschnitten? schrieb:

    wird bei einem beschnitten und beim anderen mit nullen aufgefüllt?

    Beim ersten cast wird abgehackt, beim zweiten passiert nix, weil sich der Datentyp nicht ändert.



  • Das Umwandeln in einen größeren Typ (mit gleicher signedness) ist problemlos, da ja der Wert in jedem Fall repräsentiert werden kann. Es wird also sozusagen mit Nullen aufgefüllt (zumindest bei nichtnegativen Werten).

    Wenn in einen kleineren Typ umgewandelt wird und der Wert darin nicht mehr dargestellt werden kann, wird bei einem unsigned Typ einfach rumgewrappt, d.h. die restlichen Stellen abgeschnitten. Bei signed ist es implementation-defined.



  • Hallo zusammen,

    ist also folgender Cast nicht im ANSI-C-Standard definiert?

    int a = 0x7FFFF;   /*  2Byte  */
    char b = a;        /*  Verhalten nicht definiert???? */
    

    und der Unsigned-Cast wie folgt:

    unsigned int a = 0x7FFFF;   /*  2Byte  */
    unsigned char b = a;        /*  0xFF */
    

    Gruß



  • Ja genau. Das zweite Beispiel funktioniert in jedem Fall, das erste Beispiel ist implementation-defined (und zwar einerseits, ob char signed oder unsigned ist, und falls char signed und kleiner als int ist, was bei der Zuweisung passiert)


Log in to reply