Forum: Mikrocontroller und Digitale Elektronik Verhalten von Schiebeoperator


von Thiel (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>Durch diesen befehl wird ja das untere Nibble nach oben geschoben.

Nein. Nach 'unten'.

MfG Spess

von Karl H. (kbuchegg)


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

von Thiel (Gast)


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 ?

von Falk B. (falk)


Lesenswert?

Nimm einfach unsigned char oder noch besser uint8_t, dann ist das 
eindeutig.

MfG
Falk

von Karl H. (kbuchegg)


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?

von Falk B. (falk)


Lesenswert?

Zwei Dumme, ein Gedanke.

Aber ich war dümmer, ähhh, schneller. ;-)

von Thiel (Gast)


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 
:-)

von Jo (Gast)


Lesenswert?

Definiere dir doch ein Datentyp selbst und benenne ihn möglichst kurz.
Ich hab schon einige "uchar" gesehen.
Jo

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.