2010-08-22 2 views

Répondre

10

Vous devez faire la constante entière du bon type. Le problème est que 0x100000000 est interprété comme un int, et la distribution/affectation n'aide pas: la constante elle-même est trop grande pour int. Vous devez être en mesure de préciser que la constante est de type uint64_t:

uint64_t Key = UINT64_C(0x100000000); 

fera. Si vous ne disposez pas UINT64_C disponibles, essayez:

uint64_t Key = 0x100000000ULL; 

En fait, C99 (6.4.4.1p5):

Le type d'une constante entier est la première de la liste correspondante dont sa valeur peut être représentée.

et la liste des constantes hexadécimaux sans suffixe est:

int 
long int unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

Donc, si vous invoquez votre compilateur en mode C99, vous ne devriez pas recevoir un avertissement (merci Giles!).

0

Aucune garantie, mais vous pouvez essayer:

uint64_t Key = 0x100000000ULL; 
4

Ce que vous avez écrit est parfaitement valide C99 (en supposant que vous avez #include d <stdint.h>) ¹. Il semble donc que vous avez appelé votre compilateur en mode C89 plutôt qu'en mode C99. En C89, il n'y a aucune garantie qu'un type 64 bits est disponible, mais c'est une extension courante.

Puisque vous êtes sur Linux, votre compilateur est probablement gcc. Gcc prend en charge un long long 64 bits sur toutes les plates-formes, même en mode C89. Mais vous devrez peut-être déclarer explicitement la constante long long:

uint64_t Key = 0x100000000ull; 

(ll signifie long long, u signifie non signé et est en option ici). Vous pouvez également exécuter gcc en mode C99 avec gcc -std=c99.

¹ pour les avocats de langue: et ont un type intégral avec exactement 64 bits de valeur.

Questions connexes