Advertencia dado un valor de variable larga sin firmar larga en C

Estoy usando Linux x86_64 con gcc 5.2.1 y estoy usando un código para determinar el valor máximo para la variable “unsigned long long” en el lenguaje de progtwigción C.

En mi máquina, el tamaño de “long unsigned long long” es de 8 bytes. Hacer los cálculos me dice que el rango debe ser de 0 a (2 ** 64) – 1, que es: 0 a 18446744073709551615. El código es el siguiente:

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

Cuando lo compilo, obtengo el siguiente resultado:

Ascertaining_Range.c: En la función ‘main’: Ascertaining_Range.c: 5: 25: warning: la constante entera es tan grande que está sin firmar long long a = 18446744073709551615;

Mi pregunta aquí es por qué está lanzando una advertencia. El valor está dentro de la periferia del rango. Y además, ha sido declarado explícitamente sin firmar.

Su código es correcto y esta es una advertencia falsa.

Para evitar la advertencia puedes escribir:

 unsigned long long a = 18446744073709551615ull; 

La advertencia es (ligeramente) útil para algunos literales enteros, pero no este en particular, y el comstackdor no está tratando de limitar la advertencia a los casos en que es útil.

NÓTESE BIEN. Asegúrese de que está utilizando -std=c99 o -gnu99 o posterior; antes de 1999, C no tenía oficialmente unsigned long long , y los comstackdores diferentes hacían cosas raras con grandes literales enteros.