web-dev-qa-db-ger.com

Warnung: Anzahl der linken Schicht> = Breite des Typs

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?

51

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.)

74
James McNellis

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
15
tznza

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 )

1
vipul bagga

vorzeichenloses langes x = 1UL << 31;

Fehlermeldung nicht anzeigen. Denn bevor Sie die 32 angeben, stimmt das nicht, weil nur auf 0-31 begrenzt.

1
Muthuraman

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.

0
VectorVictor