2012-03-07 17 views
7

Necesito representar un número binario de 40 bits. ¿Qué tipo de datos C se debe usar para manejar esto?¿Qué tipo de datos C puede representar un número binario de 40 bits?

+5

+1 para compensar los downvotes inexplicables. –

+0

Parece que los 2 downvoters te anotaron +3 (a juzgar por los 5 + 1 en el comentario +1) :-) –

+0

no portátil, pero en muchos TI DSP [long es un tipo de 40 bits] (http: // stackoverflow .com/a/28352310/995714) siempre se puede usar para ese fin. de largo en la mayoría de los sistemas POSIX tiene 64 bits y también se puede usar –

Respuesta

9

Si estás utilizando un compilador C99 o C11 compatible, a continuación, utilizar int_least64_t para una máxima compatibilidad. O bien, si desea un tipo sin firmar, uint_least64_t. Ambos están definidos en <stdint.h>

<stdint.h> generalmente también define int64_t, pero como no es requerido por la norma, puede no estar definido en cada implementación. Sin embargo:

  • int_least64_t - al menos 64 bits, y
  • int_fast64_t - el tamaño más rápido en esta implementación de al menos 64 bits

son ambos necesarios para estar presente en C99 y C11 (ver § 7.18.1.2-3 en el estándar C99, y § 7.20.1.2-3 en el estándar C11).


Aunque C99 especifica que es long longat least 64 bits on a particular machine (§ 5.2.4.2.1), los tipos de <stdint.h> están diseñados para ser explícitamente portátil.

Puede leer más sobre tamaños enteros en diferentes plataformas here. Tenga en cuenta que el tamaño de los tipos enteros es un problema con el tipo de datos long - en Windows de 64 bits, actualmente es de 32 bits, mientras que en 64 bits de Linux es de 64 bits. Por esta razón, creo que es más seguro usar los tipos de <stdint.h>

Vale la pena señalar que algunos sienten que long long es más legible. Personalmente, prefiero los tipos de <stdint.h>, porque te permiten decir a qué te refieres cuando los usas, lo cual me parece más legible. Por supuesto, la legibilidad es a menudo una cuestión de gusto - y si está trabajando con una base de código existente, me basta con seguir lo que hacen :)


Si el compilador sólo soporta C89, a continuación, permitirá R..'s solution usted hasta 53 bits de precisión entera.

+1

+1 por usar esto durante 'largo largo'. –

+2

No estoy de acuerdo. 'long long' es, de hecho, teóricamente * más * portable, porque una implementación C99 o C11 conforme debe proporcionar ese tipo, mientras que' int64_t' no está necesariamente presente. 'int64_t' debe usarse solo si necesita un tipo de complemento de dos exactamente 64 bits sin relleno: en casos como este, donde solo necesita" al menos 40 bits ", entonces es preferible' largo largo', ya que no agrega innecesarios restricciones – caf

+0

@caf: ¿C99 tampoco especifica 'int64_t' y familia? (Y hasta donde yo sé, todavía están presentes en C11). Si no desea especificar exactamente el ancho de 64 bits, puede usar 'int_least64_t' o' int_fast64_t'. –

3

long long es un tipo entero con al menos 64 bits. Se ajustará a los valores de 40 bits firmados en todas las plataformas. También puede usar unsigned long long para valores sin firmar de 64 bits o más.

1

Las respuestas existentes son buenas, pero si también desea compatibilidad con C89, double podrá almacenar enteros de 40 bits exactamente en todas las implementaciones conformes con IEEE 754.

Cuestiones relacionadas