Division und Shift

Gast #283840
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...
Gast #283841
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren