Forum: Mikrocontroller und Digitale Elektronik Bit-Shift Problem


von Mathias F. (savag)


Lesenswert?

Hallo,
habe hier ein einfaches Problem jedoch komme ich nicht hinter die 
Lösung.

ich habe ein Array "data" als uint8_t
data[0] = 0x06
data[1] = 0x03
data[2] = 0x00
data[3] = 0x0E
data[4] = 0x10
data[5] = 0x00

in data[2] bis data[5] befindet sich meine Zahl die ich als 32bit Wert 
empfange (0x000E1000 ergibt als dec 921600).

Nun möchte ich diese 4 Hex Werte zu einer uint32_t Wandeln über Bitshift
wie folgt:

wert_dec = (data[2] << 24 | data[3] << 16 | data[4] << 8 | data[5] << 
0);

leider kommt hier immer 4096 als Ergebniss.
Wo liegt das Problem????

von 6A66 (Gast)


Lesenswert?

Mathias Feld schrieb:
> data[2] << 24

data[2] ist uint_8.
Überlege Dir was dann bei <<24 dabei rauskommt.
Stichwort: casten

rgds

von Falk B. (falk)


Lesenswert?

@ Mathias Feld (savag)

Eher so.
1
wert_dec = ((uint32_t)data[2] << 24 | (uint32_t)data[3] << 16 | (uint32_t)data[4] << 8 | (uint32_t)data[5] << 0);

von Kai S. (zigzeg)


Lesenswert?

6A66 schrieb:
> Überlege Dir was dann bei <<24 dabei rauskommt.

Hm, eigentlich sollte eine Zahl < 256 rauskommen. Also niemals 4096.
Allerdings ist ein shift groesser als die Datentypbreite glaube ich 
undefiniert ?

PS: Ich bezweifele nicht dass casten auf den Zieltyp richtig und noetig 
ist. Wundere mich nur ueber die 4096 !

von Mathias F. (savag)


Lesenswert?

SUUUPER Danke, das wars!!!

von Peter II (Gast)


Lesenswert?

Kai S. schrieb:
> Hm, eigentlich sollte eine Zahl < 256 rauskommen. Also niemals 4096.
> Allerdings ist ein shift groesser als die Datentypbreite glaube ich
> undefiniert ?
>
> PS: Ich bezweifele nicht dass casten auf den Zieltyp richtig und noetig
> ist. Wundere mich nur ueber die 4096 !

es wird alles mindestens mit int also 16bit gerechnet.

von Kai S. (zigzeg)


Lesenswert?

Kai S. schrieb:
> Hm, eigentlich sollte eine Zahl < 256 rauskommen.

Wahrscheinlich wird die Zahl zunaechst in einen (16bit) int gecastet.
Dann liegt auch 4096 im Bereich des Moeglichen.

von Rolf Magnus (Gast)


Lesenswert?

Kai S. schrieb:
> Allerdings ist ein shift groesser als die Datentypbreite glaube ich
> undefiniert ?

Ja, richtig.

Kai S. schrieb:
> Kai S. schrieb:
>> Hm, eigentlich sollte eine Zahl < 256 rauskommen.
>
> Wahrscheinlich wird die Zahl zunaechst in einen (16bit) int gecastet.
> Dann liegt auch 4096 im Bereich des Moeglichen.

Mit Casts hat das nichts zu tun. Es nennt sich integer promotion.

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.