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


von Sascha (Gast)


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.

von johnny.m (Gast)


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.

von Oliver (Gast)


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

von Sascha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.