Kurze Frage zum Shift Operator



  • Hallo, ist durch den Standard gesichert, dass ein arithmetischer Shift (egal ob links oder rechts) bei einem unsigned Integer um einen Wert, der größer ist als CHAR_BIT*sizeof(typ), den Wert immer auf 0 setzt? Oder ist das Verhalten undefiniert bzw implementationsabhängig?

    unsigned int i = 324563;
    i<<=1000000; //definiert? i==0 ?
    


  • Im Standard findet sich:

    The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.

    Beachte: Für Ganzzahl-Typen "kleiner" als int findet ja die "integral promotion" statt -- also die implizite Umwandlung nach int bzw unsigned int -- bevor gerechnet wird. Das heißt zB, dass es bei einem unsigned char auf der linken Seite und einem Operand auf der rechten Seite zwischen 0...14 garantiert kein Problem gibt.

    Gruß,
    SP



  • Ich kapier das nicht!!!
    Das ist mir doch alles zu blöd!!!
    Warum ist auf diesem verdammten Planeten jegliche Fachinformation auf 1.000.000.000.000 Plätze verteilt???



  • Danke, Sebastian Pizer, genau das habe ich gesucht 😃

    Ich habe noch eine ähnliche Frage zum Verhalten von unsigned Integer POD's: Soweit ich weis ist ein Overflow bei der Addition laut Standard so geregelt, dass das ergebnis der addition modulo dem maximalen Wert + 1 genommen wird. Beispiel:

    unsigned int i = 0xFFFFFFFFu + 2u; // i = 1, da 0x100000001 % 0x100000000 = 1
    

    Aber wie sieht es mit Underflow bei der Subtraktion aus? Ist folgendes durch den Standard geregelt?

    unsigned int i = 0u - 1u;
    // ist i jetzt garantiert 0xFFFFFFFF ?
    

  • Mod

    C++-Standard schrieb:

    Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer.

    Also für jegliche Rechenoperationen: Ja.

    edit: Es ist dir natürlich nicht garantiert, dass bei 0-1 genau 0xFFFFFFFF rauskommt, da die genaue Größe eines ints nicht festgelegt ist. Aber es ist garantiert, dass der größtmögliche Wert herauskommt.



  • Danke SeppJ!
    Auf dieses Forum hier ist immer verlass!


Log in to reply