Verhalten von Schiebeoperator

Gast #1658828
Lesenswert?
• ▲
▼
Hallo!

char temp = 0xF8

temp1 = temp1 >> 4;

Durch diesen befehl wird ja das untere Nibble nach oben geschoben.
Ich würde gerne wissen was genau bei der Schiebung passiert :

-Wird einfach nurch nachgeschoben und mit Nullen aufgefüllt?
 Also temp1 = 0x0F
-Oder gar mit Einsen?
 Also temp1 = 0xFF
-Oder nach dem Karusselprinzip geschoben?
 Also temp1 = 0x8F

Oder kommt das gar auf den Compiler an (ich arbeite mit AVR Studio)?

Vielleicht kann mich ja schnell jemand aufklären, in der Suche bzw. im 
Tutorial Schiebeoperatoren konnte ich keine Antwort auf meine Frage 
finden (Verzeihung falls ich etwas übersehen habe)!

MfG Thiel
#1658836
Lesenswert?
• ▲
▼
Thiel schrieb:
> Hallo!
>
> char temp = 0xF8
>
> temp1 = temp1 >> 4;
>
> Durch diesen befehl wird ja das untere Nibble nach oben geschoben.

Äh, nein.
Das obere nach unten

> Ich würde gerne wissen was genau bei der Schiebung passiert :

Das ist so noch nicht genau festgelegt, da du char benutzt und für einen 
char nicht definiert ist, ob der ein Vorzeichen hat oder nicht.
Hat er ein Vorzeichen, dann ist die ganze Operation abhängig davon, wie 
die Implementierung deines Compiler das realisiert. Ist ein char 
unsgined, dann werden von links 0 Bits reingeschoben.

> -Wird einfach nurch nachgeschoben und mit Nullen aufgefüllt?
>  Also temp1 = 0x0F

Im unsigne Fall: ja

> -Oder gar mit Einsen?
>  Also temp1 = 0xFF

Nein

> -Oder nach dem Karusselprinzip geschoben?
>  Also temp1 = 0x8F

Das wäre rotieren und nicht schieben
Gast #1658850
Lesenswert?
• ▲
▼
Ok danke für die schnelle Antwort.

Ja das obere Nibble nach unten... verschrieben.

Also deswegen immer sicherheitshalber maskieren, da wenn nicht unsigned 
das Verhalten allein vom Compiler abhängig ist ?
#1658852
Lesenswert?
• ▲
▼
Thiel schrieb:
> Ok danke für die schnelle Antwort.
>
> Ja das obere Nibble nach unten... verschrieben.
>
> Also deswegen immer sicherheitshalber maskieren, da wenn nicht unsigned
> das Verhalten allein vom Compiler abhängig ist ?

Ja.
Oder aber besser: Warum nimmst du nicht gleich unsigned char anstelle 
von char?
Gast #1658915
Lesenswert?
• ▲
▼
Danke. Doppelt hält besser ;-)

Werde ab nun an unsigned char verwenden bzw. uint8_t
Diese Datentypen sind ja in der libc enthalten soweit ich weiß. Bisher 
habe ich diese jedoch nie verwendet, da die datentypen eben so 
"umständliche" namen haben und für meine kurzen programme eben einfach 
char oder int eben schneller waren und ich nichts extra einbinden musste 
:-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.