web-dev-qa-db-fra.com

avertissement: nombre de décalage vers la gauche> = largeur du type

Je suis très nouveau dans le traitement des bits et je suis resté coincé sur l'avertissement suivant lors de la compilation:

 7: warning: left shift count >= width of type

Ma ligne 7 ressemble à ceci

unsigned long int x = 1 << 32;

Cela aurait du sens si la taille de long sur mon système était de 32 bits. Cependant, sizeof(long) renvoie 8 Et CHAR_BIT Est défini comme 8 Suggérant que long devrait être 8x8 = 64 bits.

Qu'est-ce que j'oublie ici? sizeof et CHAR_BIT Sont-ils inexacts ou ai-je mal compris quelque chose de fondamental?

51

long peut être de type 64 bits, mais 1 est toujours un int. Vous devez faire 1 une long int en utilisant le suffixe L:

unsigned long x = 1UL << 32;

(Vous devriez également le faire unsigned en utilisant le suffixe U comme je l'ai montré, pour éviter les problèmes de décalage à gauche d'un entier signé. Il n'y a aucun problème quand un long est 64 bits de large et vous décalez de 32 bits, mais ce serait un problème si vous décaliez de 63 bits)

74
James McNellis

unsigned long est 32 bits ou 64 bits, selon votre système. unsigned long long est toujours 64 bits. Vous devez le faire comme suit:

unsigned long long x = 1ULL << 32
15
tznza

Vous ne pouvez pas déplacer une valeur vers son bit maximum

int x;         // let int be 4 bytes so max bits : 32 
x <<= 32; 

Donc, cela génère l'avertissement

left shift count >= width of type (i.e type = int = 32 )

1
vipul bagga

long non signé x = 1UL << 31;

N'affiche pas le message d'erreur. Parce qu'avant de spécifier le 32, ce n'est pas vrai car limité à 0-31.

1
Muthuraman

La solution acceptée est bonne pour [constante] ULL << 32 mais pas bonne pour les variables existantes - par ex. [variable] << 32. La solution complète pour les variables est: ((non signé long long) [variable] << 32). À part: Mon opinion personnelle sur cet avertissement est qu'il est totalement inutile en premier lieu. Le compilateur peut voir quel est le type de données de réception et connaît la largeur des paramètres à partir des définitions dans les en-têtes ou les valeurs constantes. Je crois que Apple pourrait rendre le compilateur clang un peu plus intelligent qu'il ne l'est concernant cet avertissement.

0
VectorVictor