Forum: Compiler & IDEs Logisches Rechtsschieben


von Albert .. (albert-k)


Lesenswert?

Hallo zusammen
Ich habe mal eine eigentlich ganz Simple Frage:

Gibt es in C ein LOGISCHES Rechtsschieben?
Grund ist folgender: Ich habe einen negativen Integer denn ich gerne um 
16bit nach rechts schieben würde, jedoch ohne das Vorzeichen zu 
beachten. Das ist ja nichts anderes als ein Logisches rechts schieben 
statt einem arithmetischen schieben wie man es bsw. durch
1
(iVal>>16)
machen würde und bei dem bei einer negativen Zahl einsen nachgeschoben 
werden.

In Java ging das mit >>>>, aber in C kenne ich da nichts. Oder bleibt 
mir da nichts anders übrig als entweder
1
test |= (iData >> 16) & 0xFFFF;
zu verwenden, oder diesen Schnippsel in Assembler zu schreiben (wenn der 
Controller Logisches rechtsschieben unterstützt)?

von Bernhard R. (barnyhh)


Lesenswert?

Logisches Rechtsschieben erreicht man folgendermaßen:

Man nehme eine unsigned Variable und schiebe selbige nach rechts.
Das wars.

Bernhard

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

rechtsschieben von vorzeichenbehafteten, negativen Zahlen ist in C 
"implementation-defined". Du kannst also weder von arithmetischem noch 
von logischem Schieben ausgehen. Wenn du definiertes, logisches 
rechtsschieben brauchst musst du maskieren.

Matthias

von Albert .. (albert-k)


Lesenswert?

Bernhard R. schrieb:
> Logisches Rechtsschieben erreicht man folgendermaßen:
>
> Man nehme eine unsigned Variable und schiebe selbige nach rechts.
> Das wars.
>
> Bernhard

Ahhhh, ok. Dachte das er auch bei einem unsigned das MSB als Vorzeichen 
interpretiert und 1 nachschiebt. Aber es funktioniert mit dem unsigned 
int wunderbar. Vielen Dank!

von Andreas R. (rebirama)


Lesenswert?

wie Bernhard R. schon geschrieben hat:

cast auf unsigned und dann ">>"

Begründung:

Shiften von signed Variablen nach rechts ist von Compiler zu Compiler 
unterschiedlich. Vom GCC weiß ichs definitiv, dass dabei das Vorzeichen 
erweitert wird. Damit ist für z.B. signed int ">>1" gleichbeteutend mit 
"/2".
Bei unsigned Variablen ist der Compiler von C-Standard dazu verpflichtet 
eine Null aufzufüllen. Ganz sauber ist die Angelegenheit aber trotzdem 
nicht, denn die selbst die Repräsentation von vorzeichenbehafteten 
Zahlen ist AFAIK "implementation defined".

von (prx) A. K. (prx)


Lesenswert?

Andreas R. schrieb:

> Shiften von signed Variablen nach rechts ist von Compiler zu Compiler
> unterschiedlich.

Undefiniert stimmt schon, kurioserweise sogar in C99, aber kennst du 
tatsächlich ANSI-C Compiler (also nicht irgendwas von anno 70er), der 
bei negativen Werten Nullen reinschiebt? Mir jedenfalls ist noch keiner 
untergekommen.

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.