Si estoy usando largos largos en mi código, ¿puedo garantizar absolutamente el 100% de que tendrán 64 bits sin importar en qué máquina se ejecute el código?
No, el estándar C99 dice que tendrá al menos 64 bits. Así que podría ser más que eso en algún punto, supongo. Puede usar el tipo int64_t
si necesita 64bits siempre suponiendo que tiene disponible stdint.h
(estándar en C99).
#include int64_t your_i64;
Puede probar si su comstackdor cumple con C99 con respecto a los números en el preprocesador con esto
# if (~0U < 18446744073709551615U) # error "this should be a large positive value, at least ULLONG_MAX >= 2^{64} - 1" # endif
Esto funciona ya que todos los valores sin firmar (en el preprocesador) deben ser del mismo tipo que uintmax_t
por lo que 0U
es de tipo uintmax_t
y ~0U
, 0U-1
y -1U
son el número máximo representable.
Si esta prueba funciona, es muy probable que unsigned long long
sea de hecho uintmax_t
.
Para una expresión válida después de la fase de preprocesamiento para probar esto con los tipos reales, haga
unsigned long long has_ullong_max[-1 + 2*((0ULL - 1) >= 18446744073709551615ULL)];
Esto hace el mismo tipo de truco, pero utiliza el ULL
postfix para asegurarse de tener constantes de tipo unsigned long long
.
Están garantizados para ser un mínimo de 64 bits. En teoría, es posible que puedan ser más grandes (p. Ej., 128 bits), aunque razonablemente solo son 64 bits en cualquier cosa disponible actualmente.
Con
#if CHAR_BIT * sizeof (long long) != 64 #pragma error "long long is not 64 bits" #endif
o algún equivalente.
Basado en el comentario: si desea admitir comstackdores en los que no se puede usar sizeof en el preprocesador, vea este hilo:
http://www.daniweb.com/forums/thread13553.html
Algo como esto:
char longlongcheck[(sizeof(long long) * CHAR_BIT) == 64]; // won't compile if the expression is 0.