Forum: Mikrocontroller und Digitale Elektronik 4 Bytes nach Long shiften !?


von Robert Wachs (Gast)


Lesenswert?

Hallo!

Ich bin bei einem meiner Projekte auf ein Problem gestoßen:

Ich verwende einen Buffer, den ich per UART fülle:


unsigned char buffer[4];

Füllen:
1
buffer[i]=UDR; // Das ganze 4 mal, i++

Nun möchte ich diese 4 Bytes in eine Zahl umwandeln. Dazu habe ich mir
eine Variable "zahl" als unsigned long deklariert und verwende
folgenden Code:

(i ist 0)
1
zahl =   (buffer[i] << 24) +
2
  (buffer[i+1] << 16) +
3
  (buffer[i+2] << 8) + (buffer[i+3]);

Meiner bisherigen Logik nach sollte das funktionieren.

Aber:

main.c:81: warning: left shift count >= width of type
main.c:82: warning: left shift count >= width of type

Warum?

Vielen Dank für einen Hinweis!

von ka-long (Gast)


Lesenswert?

Hi,

weil buffer[i] kein long ist.


mach mal
(unsined long)buffer[i]

Gruß ka-long

von Benedikt K. (benedikt)


Lesenswert?

Habe ich auch schon über den Fehler gewundert, habs dann mit
a+b*256+c*65536+d*16777216 gemacht.
Der erzeugte Code ist ähnlich (oder sogar identisch ?)

Das mit den Shifts scheint aber trotz der Warnung zu funktionieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Alternativ:
1
zahl = buffer[i];
2
zahl <<= 8;
3
zahl += buffer[i + 1];
4
zahl <<= 8;
5
zahl += buffer[i + 2];
6
zahl <<= 8;
7
zahl += buffer[i + 3];

von Robert Wachs (Gast)


Lesenswert?

Ach weil Buffer Char ist macht er keine automatischen Cast noch long,
wenn ich über die Grenze hinaus schiebe?

Danke!

Bisher gefällt mir Rufus' Variante am besten.

Man lernt nie aus.

von Jens (Gast)


Lesenswert?

#include <string.h>

memcpy(&zahl, &Buffer[0], 4);

oder je nachdem ,wie es implementiert wurde

memcpy(&Buffer[0], &zahl, 4)

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.