Definir el entero de 64 bits de ancho en Linux

Intento definir un entero de 64 bits de ancho utilizando el lenguaje C en Ubnutu 9.10. 9223372036854775808 es 2 ^ 23

long long max=9223372036854775808 long max=9223372036854775808 

Cuando lo compilo, el comstackdor dio el mensaje de advertencia:

 binary.c:79:19: warning: integer constant is so large that it is unsigned binary.c: In function 'bitReversal': binary.c:79: warning: this decimal constant is unsigned only in ISO C90 binary.c:79: warning: integer constant is too large for 'long' type 

¿Es el tipo largo de 64 bits de ancho?

Atentamente,

  long long max=9223372036854775808LL; // Note the LL // long max=9223372036854775808L; // Note the L 

Un tipo long long es al menos 64 bits, un tipo long es al menos 32 bits. El ancho real depende del comstackdor y la plataforma de destino.

Utilice int64_t e int32_t para asegurarse de que el int32_t de int32_t bits pueda caber en la variable.

El problema que tiene es que el número que está usando (9223372036854775808) es 2**63 , y el valor máximo que puede contener su long long (como un tipo de complemento de 2 bits con signo de 64 bits) es uno menos que eso – 2**63 - 1 , o 9223372036854775807 (eso es 63 binarios 1s seguidos).

A las constantes que son demasiado grandes para un long long (como en este caso) se les asigna el tipo unsigned long long , por lo que se obtiene que la integer constant is so large that it is unsigned advertencia integer constant is so large that it is unsigned .

El tipo long es de al menos 32 bits y el tipo long long al menos 64 bits (ambos incluyen el bit de signo).

Creo que depende de qué plataforma uses. Si necesita saber exactamente qué tipo de tipo de entero usa, debe usar tipos de Stdint.h si tiene este archivo de inclusión en su sistema.

No estoy seguro de que solucione el problema (la solución LL se ve bien). Pero aquí hay una recomendación:

Debes usar la notación hexadecimal para escribir el valor máximo de algo.

 unsigned char max = 0xFF; unsigned short max = 0xFFFF; uint32_t max = 0xFFFFFFFF; uint64_t max = 0xFFFFFFFFFFFFFFFF; 

Como puedes ver es legible.

Para mostrar el valor:

printf("%lld\n", value_of_64b_int);