mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uint64_t: warning: left shift count >= width of type


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich experimentiere gerade mit einem ENC28J60.

Da ich die MAC-Addressen nicht einem Char-Array speichern wollte, habe 
ich eine uint64_t-Variable (unsigned long long) genommen.

Ich habe mir dann ein Makro geschrieben, welches 6 einzelne Bytes in die 
eine Variable schreibt:
#define GET_MAC(MAC1, MAC2, MAC3, MAC4, MAC5, MAC6)    (((u08_t)MAC1) | 
(((u08_t)MAC2) << 8) | (((u08_t)MAC3) << 16) | (((u08_t)MAC4) << 24) | 
(((u08_t)MAC5) << 32) | (((u08_t)MAC6) << 40))


Allerdigs bekomme ich beim kompilieren immer die Fehler:
../main.c:27: warning: left shift count >= width of type
../main.c:27: warning: left shift count >= width of type
../main.c:27: warning: left shift count >= width of type
../main.c:27: warning: left shift count >= width of type


Wenn ich die Variable direkt angebe mit z.B. mac = 0x112233445566
Dann gibts auch nen Fehler. Da muss man dann noch ull hinterstellen wie 
z.B. mac = 0x112233445566ull

Aber wie mache ich das beim Makro? Habe mit ull schon versucht an 
versch. Stellen. Hat baer nicht funktioniert.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du eine Variable nach "u08_t" (also 8-Bit-Int) castest und 
versuchst, diese um mehr als 7 Stellen nach links zu schieben, dann geht 
das eben nicht.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss ja nicht, worauf und womit du programmierst, aber wenn der 
Compiler als default-Datentyp int nimmt, (was anderes sagst du ihm ja 
nicht), dann erwartet der halt nur 16 bit.

(((u08_t)MAC3) << 16) | (((u08_t)MAC4) << 24) |
(((u08_t)MAC5) << 32) | (((u08_t)MAC6) << 40))

sind dann ausserhalb der 16 bit. Ergibt deine vier Warnungen.

Also mach zumindest aus den letzten vieren sowas wie

(((uint64_t)((u08_t)MAC6)) << 40)


Oliver

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh nein!
Bin ich blind!

Das u08_t sollte natuerlich uint64_t heissen.


Danke!

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.