Forum: Mikrocontroller und Digitale Elektronik msp430 bitwise shifts: <<, >> mit C


von Paul E. (paul_e)


Lesenswert?

Hallo,
ich steh gerade auf dem Schlauch.
Ich versuche einen Shiftbefehl durchzuführen das klappt prinzipell auch, 
aber ab einer bestimmten Größe wird es Mist. Folgendes Beispiel:
1
 rh_value = (xyz1[0]>>4);
2
    printf("final: %x\r\n",xyz1[0]);
3
    printf("final: %x\r\n",rh_value);

Ausgabe ist dann wie folgt:

final: 7b2e
final: 7b2

oder halt für große Werte:

final: 8523
final: f852

Jemand einen Tipp für mich.
eac

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

0xf852 ist (in dieser Schreibweise) eine vorzeichenlose Zahl, aber
wenn die Variable xyz1[] selbst vorzeichenbehaftet ist, dann schiebt
die Schiebeoperation "von links" 1-bits nach, um das Vorzeichen zu
erhalten.  Wenn xyz1[] vorzeichenlos deklariert ist, sollten hingegen
0-bits nachgeschoben werden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Welchen Datentyp verwendest Du? Bist Du Dir dessen bewusst, daß das 
Verhalten der Shift-Operatoren nur für vorzeichenlose Typen definiert 
ist?

von Paul E. (paul_e)


Lesenswert?

1
  unsigned int rh_value;
2
  static int16_t xyz1[3] = {0,0,0};

das heißt mein Ergebnis ist schon unsigned

eac

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, xyz1 ist signed, denn int16_t ist ein vorzeichenbehafteter
Datentyp.  Der vorzeichenlose Typ heißt uint16_t.

von Paul E. (paul_e)


Lesenswert?

Thx @ all. War auch gerade in den Header Dateien unterwegs: Ich hab 
u_int16_t gefunden. Scheint aber Beides zu funktionieren.
Jetzt ist das Ergebnis wie erwartet:

final: bd0f
final: bd0

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Paul E. schrieb:
> Ich hab
> u_int16_t gefunden. Scheint aber Beides zu funktionieren.

uint16_t ist (via <stdint.h> bzw. <inttypes.h>) durch C99 
standardisiert.

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.