www.mikrocontroller.net

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


Autor: Robert Wachs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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)
zahl =   (buffer[i] << 24) +
  (buffer[i+1] << 16) +
  (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!

Autor: ka-long (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

weil buffer[i] kein long ist.


mach mal
(unsined long)buffer[i]

Gruß ka-long

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ:
zahl = buffer[i];
zahl <<= 8;
zahl += buffer[i + 1];
zahl <<= 8;
zahl += buffer[i + 2];
zahl <<= 8;
zahl += buffer[i + 3];

Autor: Robert Wachs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <string.h>

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

oder je nachdem ,wie es implementiert wurde

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.