2010-08-22 16 views

Respuesta

10

Usted debe proceder a la constante entera del tipo correcto. El problema es que 0x100000000 se interpreta como int, y la conversión/asignación no ayuda: la constante en sí es demasiado grande para int. Tienes que ser capaz de especificar que la constante es de tipo uint64_t:

uint64_t Key = UINT64_C(0x100000000); 

lo hará. Si usted no tiene UINT64_C disponible, intente:

uint64_t Key = 0x100000000ULL; 

De hecho, en C99 (6.4.4.1p5):

El tipo de una constante entera es el primero de la lista correspondiente en que su valor puede ser representado.

y la lista de constantes hexadecimales sin ningún sufijo es:

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

lo tanto, si se invocó su compilador en modo C99, que no deben recibir un aviso (gracias Giles!).

0

No hay garantía, pero es posible probar:

uint64_t Key = 0x100000000ULL; 
4

Lo que ha escrito es perfectamente válido C99 (suponiendo que tiene #include d <stdint.h>) ¹. Parece que ha invocado su compilador en el modo C89 en lugar del modo C99. En C89, no hay garantía de que esté disponible un tipo de 64 bits, pero es una extensión común.

Dado que está en Linux, su compilador es probablemente gcc. Gcc admite un long long de 64 bits en todas las plataformas, incluso en el modo C89. Sin embargo, puede que tenga que declarar explícitamente la constante como long long:

uint64_t Key = 0x100000000ull; 

(ll significa long long; u significa sin firmar y es opcional aquí). Alternativamente, es posible que desee ejecutar gcc en modo C99 con gcc -std=c99.

¹ para los abogados de idiomas: y tienen un tipo integral con exactamente 64 bits de valor.

Cuestiones relacionadas