Forum: Compiler & IDEs Bytes in Long Typ schieben


von Matthias (Gast)


Lesenswert?

Hi,

bin mit dem Bit-Shift-Operator noch nicht so vertraut und wollte mal 
fragen ob das so funktioniert.

Ich habe ein Array mit 3 unsigned char Werten an der Stelle 5,4,3.
Diese Stellen eine 24 Bit Variable dar, die ich asuwerten möchte.

1.) Ich nehme dafür eine neue Variable vom Typ long

2.) Da die bits vertauscht sind muss ich mit dem MSB bei Stelle 5 
anfangen

unsigned long size;

size = array[5];
size = (size << 8);
size = array[4];
size = (size << 8);
size = array[4];

nun sollte size aus folgendem Wert bestehen:

size = 0x00array[5]array[4]array[3];

ist das so ok oder überschreibe ich mit size = array[4]; wieder alle 
Stellen ?

von Rolf Magnus (Gast)


Lesenswert?

> bin mit dem Bit-Shift-Operator noch nicht so vertraut

Die verweendest du richtig, aber die Zuweisung nicht.

> ist das so ok oder überschreibe ich mit size = array[4]; wieder alle
> Stellen ?

Letzteres. Ändere es in:
1
size = array[5];
2
size = (size << 8);
3
size |= array[4];
4
size = (size << 8);
5
size |= array[3];

von Matthias (Gast)


Lesenswert?

Ich sag danke !

von Herrpool (Gast)


Lesenswert?

ich hab das gefühl bei allen klappt es nur bei mir nicht ... ich möchte 
zwei bytes in eine 16bit variable schreiben. sollange ich nur die 
letzten 12 bits benutze funktioniert es tatellos. wenn ich aber zb FF 
und FF zusammenfügen will kommt 000001 raus und nicht FFFF. ich benutz 
einen mega32 und winavr.

uint8_t top = 0xFF;
uint8_t bottom = 0xFF;
uint16_t size=0;


size = top;
size = (size << 8);
size |= bottom;

müßte doch funktionieren oder?

von Philipp B. (philipp_burch)


Lesenswert?

Wie gibst du den Wert von 'size' aus? Vielleicht wird da mit einer 
signed variablen gearbeitet, dann entspricht 0xffff üblicherweise 
(zumindest bei 16-Bit) dezimal -1. Was ist es denn für einen Compiler? 
Du könntest auch versuchen, 'top' und 'bottom' vor dem Speichern noch 
explizit nach 'uint16_t' zu casten.
Oder so:
1
size = ((uint16_t)top << 8) | (uint16_t)bottom;

von Herrpool (Gast)


Lesenswert?

besten dank!!! mittlerweile läuft es!! die ausgabe funktion nutze ich 
für alles mögliche deshalb war da eine abs() mit drin. einen unsigned 
scheint er nach abs() zum signed zumachen oder was auch immer, 
jedenfalls funktioniert das nun ohne ;)

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.