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