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

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