Announcement

Collapse
No announcement yet.

Warum funktionert multiplizieren mit shiften nicht bei hohen zahlen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Warum funktionert multiplizieren mit shiften nicht bei hohen zahlen?

    Hallo!

    ich hab folgende zeilen:
    Code:
    uint64_t a = 30212469*pow(2,32); // 129761566286413824
    uint64_t b = 30212469<<32; // 0
    
    uint64_t x = 2*pow(2,5); //64
    uint64_t y = 2<<5; //64
    Im kommentar steht jeweils das ergebnis das im debugger angezeigt wird.

    Mit den kleinen Zahlen passt das ergebniss, bei den großen nicht, wie kann das sein?

    Danke

  • #2
    Ebenso ist das Ergebnis laut C- und C++-Sprachnorm undefiniert, wenn die Anzahl der Bitverschiebungen größer oder gleich der Bitbreite der Rechenarchitektur ist Wird beispielsweise auf einer 32-Bit Architektur von Intel-Prozessoren gearbeitet (IA32), so bewirkt eine Verschiebung um 32 Stellen oft garkeine Veränderng des Ergebnisses, d.h. für x = y << 32 ergibt sich x == y. Der Grund liegt in der Art und Weise, wie die Compiler die Schiebeoperation in Maschinencode umsetzen. Die meisten Prozessoren haben direkte Befehle zum Schieben von Bits, wobei die Anzahl der Verschiebungen nur in begrenzter Breite im Maschinenbefehl codiert wird. Für IA32 sind z. B. 5 Bitstellen vorgesehen, um die Zahl der Verschiebungen abzulegen. Daher können nur Verschiebungen im Bereich 0 bis 31 Stellen korrekt ausgeführt werden. Entsprechende Beschränkungen können für andere Architekturen und Datentypen ebenso vorhanden sein

    http://de.wikipedia.org/wiki/Bitweiser_Operator
    Christian

    Comment


    • #3
      Weil dein Literal 30212469 erstmal nur 32bit ist und damit gerechnet wird. Das du auf der linken Seite einen 64 bit Typ hast ist egal das wird erst nach der Operation relevant wenn das Ergebnis auf 64 bit gecastest wird (und damit zu spät ist). Wenn du einen 64 bit Literal meinst solltest du das auch dranschreiben (30212469LL).

      Comment

      Working...
      X