www.mikrocontroller.net

Forum: Compiler & IDEs Logisches Rechtsschieben


Autor: Albert ... (albert-k)
Datum:

Bewertung
0 lesenswert
nicht 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
(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
test |= (iData >> 16) & 0xFFFF;
zu verwenden, oder diesen Schnippsel in Assembler zu schreiben (wenn der 
Controller Logisches rechtsschieben unterstützt)?

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Logisches Rechtsschieben erreicht man folgendermaßen:

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

Bernhard

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Albert ... (albert-k)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Andreas R. (rebirama)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.