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.
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.
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
Oh nein! Bin ich blind! Das u08_t sollte natuerlich uint64_t heissen. Danke!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.