C: mucho tiempo siempre 64 bit?

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.