Avertissement étant donné la valeur de la variable long long non signé en C

J’utilise Linux x86_64 avec gcc 5.2.1 et un code pour déterminer la valeur maximale de la variable “unsigned long long” dans le langage de programmation C.

Dans ma machine, la taille de “unsigned long long” est de 8 octets. Le calcul me dit que la plage devrait être comprise entre 0 et (2 ** 64) – 1, soit: 0 à 18446744073709551615. Le code est le suivant:

#include int main() { unsigned long long a = 18446744073709551615; printf("a: %llu\n", a); return 0; } 

Lorsque je le comstack, j’obtiens le résultat suivant:

Ascertaining_Range.c: Dans la fonction ‘main’: Ascertaining_Range.c: 5: 25: warning: la constante entière est tellement grande qu’elle est unsigned unsigned long long a = 18446744073709551615;

Ma question est la suivante: pourquoi lance-t-il un avertissement? La valeur est dans la périphérie de la plage. Et aussi, il a été déclaré non signé explicitement.

Votre code est correct et il s’agit d’un faux avertissement.

Pour éviter l’avertissement, vous pouvez écrire:

 unsigned long long a = 18446744073709551615ull; 

L’avertissement est (légèrement) utile pour certains littéraux entiers, mais pas pour celui-ci en particulier, et le compilateur n’essaie pas très fort de le limiter aux cas où il est utile.

NB Assurez-vous que vous utilisez -std=c99 ou -gnu99 ou une version ultérieure; avant 1999, C n’avait pas officiellement unsigned long long , et différents compilateurs ont fait des choses étranges avec de grands nombres entiers.