Forum: Compiler & IDEs Division und Shift


von Uwe Nagel (Gast)


Lesenswert?

Hier im Forum wird öfter mal die Optimierung des Compilers erwähnt, die
Divisionen durch Zweierpotenzen mit Shift-Befehle ersetzt.
Hieraus könnte man schliessen, das der Ausdruck:
foo/=2; gleichzusetzen ist mit  foo>>=1;
Das stimmt jedoch nur für vorzeichenlose Typen !!
Beim Typ int oder int16_t addiert der Compiler bei negativen Zahlen
jedoch (Nenner-1) bevor er schiebt. Das ist auch völlig korrekt so,
denn sonst würde -3/2 das Ergebnis -2 liefern anstelle der erwarteten
-1. -3>>1 ergibt nämlich -2 !!
Ich erwähne das, weil ich darauf reingefallen bin. Wollte eigentlich
das niederwertige Bit einer Variablen löschen und dann mit 50
multiplizieren. Der Ausdruck (foo/2)*100 führte jedoch zu falschen
Ergebnissen, als foo negativ wurde...

von Werner Hoch (Gast)


Lesenswert?

Vorzeichenbehaftete Zahlen solltest du nicht shiften.
Das Ergebnis ist im C-Standard IIRC als implementation defined
angegeben.

Es ist besser du verwendest eine Division
  x/=4;

Der Compiler kann das automatisch in einen Shiftbefehl umsetzten und
vorzeichenbehaftete Variablen korrekt verarbeiten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.