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;
- imprimer des bits d’un pointeur vide
- Les ferrors effectuent-ils plusieurs écritures?
- débogage dans eclipse à l’aide de gdb sur mac – Échec d’exécution de la commande MI: -exec-run
- Comment le terminateur de chaîne ‘\ 0’ a-t-il la même valeur que la constante entière 0?
- Comment supprimer des espaces dans une phrase
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.