C - Wertzuweisung 2



  • Hallo,

    ich habe nochmal nachgedacht und hoffe ich kann meine Frage nun strukturiert stellen.

    Was ich nun verstande habe ist, dass der Formatstring Platzhalter wirklich nur die passenden festgelegten Werte zulässt,
    da gibt es keine wenn und aber. Da gibt zu jedem Datentyp einen entsprechenden Platzhalter. Ansonsten bekommt man ein undefiniertes Verhalten.

    also ich habe folgendes für mich zusammengetragen

    int bzw. long (bei mir so habe ich mit sizeof abgefragt)

    Wertebereich: -2^31 - 2^31 - 1

    Dezimal-Literale: -2147483648 - +2147483647

    unsigned long

    Wertebereich: 0 - 2^32 - 1

    Dezimal-Literale: 0ul - 4294967295ul

    long long

    Wertebereich: -2^63 - 2^63 - 1

    Dezimal-Literale: -9223372036854775808LL - +9223372036854775807LL

    unsigned long long

    Wertebereich: 0 - 2^64 - 1

    Dezimal-Literale: 0ull - 18446744073709551615ull

    1. Ich möchte wissen welche der folgende Wertzuweisungen unproblematisch sind un welche dies nicht sind - in diesem Fall dann warum.

    2. Welche Zuweisungen werden zwar ausgeführt, weisen der Variable aber
      nicht den gewünschten Wert der rechten Seite zu? (Was passiert stattdessen?)

    3. Welchen Wert und Datentyp haben die rechten "elementaren Ausdrücke"
      bzw. sind diese überhaupt alle gültig?

    ich möchte teilweise Werte von oben und teilweise vlt etwas merkwürde
    Werte einer unsigned long long variable zuordnen:

    Hinweis: ich habe die Werte so konstruiert das immer den Wertebereich von einem der obigen Datentypen überschreiten positiv und negativ.
    (ich hab immer die erste oder zweite Stelle um 1 größer gemacht)

    unsigned long long number = -19000000000000000000 ;

    unsigned long long number = -9300000000000000000 ;

    unsigned long long number = -5000000000 ;

    unsigned long long number = -3000000000 ;

    unsigned long long number = -1 ;

    unsigned long long number = 3000000000 ;

    unsigned long long number = 5000000000 ;

    unsigned long long number = 9300000000000000000 ;

    unsigned long long number = 19000000000000000000 ;

    unsigned long long number = -19000000000000000000ul ;

    unsigned long long number = -9300000000000000000ul ;

    unsigned long long number = -5000000000ul ;

    unsigned long long number = -3000000000ul ;

    unsigned long long number = -1ul ;

    unsigned long long number = 3000000000ul ;

    unsigned long long number = 5000000000ul ;

    unsigned long long number = 9300000000000000000ul ;

    unsigned long long number = 19000000000000000000ul ;

    unsigned long long number = -19000000000000000000LL ;

    unsigned long long number = -9300000000000000000LL ;

    unsigned long long number = -5000000000LL ;

    unsigned long long number = -3000000000LL ;

    unsigned long long number = -1LL ;

    unsigned long long number = 3000000000LL ;

    unsigned long long number = 5000000000LL ;

    unsigned long long number = 9300000000000000000LL ;

    unsigned long long number = 19000000000000000000LL ;

    unsigned long long number = -19000000000000000000ull ;

    unsigned long long number = -9300000000000000000ull ;

    unsigned long long number = -5000000000ull ;

    unsigned long long number = -3000000000ull ;

    unsigned long long number = -1ull ;

    unsigned long long number = 3000000000ull ;

    unsigned long long number = 5000000000ull ;

    unsigned long long number = 9300000000000000000ull ;

    unsigned long long number = 19000000000000000000ull ;

    Vielen Dank für alle Hilfe,

    James





  • @JamesNguyen Und du darfst auch den Compiler fragen, wenn der Warnlevel auf höchster Stufe steht.

    Dann lernst du auch gleich, wie die Meldungen dazu aussehen.

    Es geht um die Warnungen, nicht darum was der Compiler daraus macht. Bei UB kann jeder Compiler etwas Anderes machen.


Log in to reply