Ich bin sehr neu im Umgang mit Bits und bin beim Kompilieren auf die folgende Warnung gestoßen:
7: warning: left shift count >= width of type
Meine Zeile 7 sieht so aus
unsigned long int x = 1 << 32;
Dies wäre sinnvoll, wenn die Größe von long
auf meinem System 32 Bit wäre. sizeof(long)
gibt jedoch 8
Zurück und CHAR_BIT
Ist als 8
Definiert, was bedeutet, dass long 8x8 = 64 Bit lang sein sollte.
Was vermisse ich hier? Sind sizeof
und CHAR_BIT
Falsch oder habe ich etwas Grundlegendes falsch verstanden?
long
kann ein 64-Bit-Typ sein, aber 1
ist immer noch ein int
. Du musst 1
ein long int
mit dem Suffix L
:
unsigned long x = 1UL << 32;
(Sie sollten es auch unsigned
mit dem Suffix U
machen, wie ich gezeigt habe, um die Probleme beim Verschieben einer Ganzzahl mit Vorzeichen nach links zu vermeiden. Es gibt kein Problem, wenn ein long
ist 64 Bit breit und Sie verschieben sich um 32 Bit, aber es wäre ein Problem, wenn Sie 63 Bit verschieben würden.)
unsigned long
ist 32 Bit oder 64 Bit, was von Ihrem System abhängt. unsigned long long
ist immer 64 Bit. Sie sollten es wie folgt tun:
unsigned long long x = 1ULL << 32
Sie können einen Wert nicht auf sein maximales Bit verschieben
int x; // let int be 4 bytes so max bits : 32
x <<= 32;
Dies erzeugt also die Warnung
left shift count >= width of type (i.e type = int = 32 )
vorzeichenloses langes x = 1UL << 31;
Fehlermeldung nicht anzeigen. Denn bevor Sie die 32 angeben, stimmt das nicht, weil nur auf 0-31 begrenzt.
Die akzeptierte Lösung ist für [konstante] ULL << 32 in Ordnung, für vorhandene Variablen jedoch nicht gut - z. [variable] << 32. Die vollständige Lösung für Variablen lautet: ((unsigned long long) [variable] << 32). Nebenbei: Meine persönliche Meinung zu dieser Warnung ist, dass sie überhaupt nicht notwendig ist. Der Compiler kann den empfangenen Datentyp erkennen und die Breite der Parameter anhand der Definitionen in Headern oder konstanten Werten ermitteln. Ich glaube Apple könnte den Clang-Compiler ein wenig intelligenter machen, als es in Bezug auf diese Warnung ist.