Pregunta

Soy consciente de que la especificación del lenguaje C no dicta el tamaño exacto de cada tipo de entero (por ejemplo, int).

Lo que me pregunto es:¿Hay alguna manera en C (no en C++) de definir un tipo de entero con un tamaño específico que garantice que será el mismo en diferentes arquitecturas?Como:

typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>

O cualquier otra forma que permita compilar otras partes del programa en una arquitectura diferente.

¿Fue útil?

Solución

lo que quieres es <stdint.h>, qué compiladores que cumplan con el estándar C ("C99") implementarán.Desafortunadamente, esto no incluye a Microsoft.Afortunadamente, un proyecto de código abierto proporciona una <stdint.h> para Windows, consulte tipos msint.

Esto le permitirá utilizar int32_t y uint32_t, más 8, 16 y 64, y muchos otros.

Nota:el archivo de encabezado en sí no es opcional en el estándar; sin embargo, la mayoría de los tipos en el encabezado son individualmente opcionales.Algunos no lo son.Los tipos más utilizados son los opcionales, pero nada impide utilizar los necesarios.La cuestión es que, si una implementación proporciona el encabezado, en la práctica definen todos los tipos.

Otros consejos

C99, en stdint.h , define tipos como int8_t y int16_t .

No, el estándar C especifica tamaños mínimos para tipos integrales, pero no garantiza los tamaños máximos.

Una implementación proporcionará tipos intN_t si hay tipos de ese tamaño disponibles. Solo menciono que, dado que tenía una etiqueta multiplataforma, una implementación que no tenga un tipo de ancho de bit correcto no necesita proporcionar esos tipos.

Generalmente, puede seleccionar (con la configuración definida con, por ejemplo, cc -D_INT16_IS_INT y #ifdef s) el tipo correcto para usar para un tamaño de bit específico. Puede elaborar las definiciones requeridas para cada plataforma que desee admitir con el código C utilizando CHAR_BIT y sizeof () .

La sección relevante del borrador de c1x (n1362) es:


7.18.1.1 Tipos de enteros de ancho exacto

  1. El nombre typedef intN_t designa un tipo de entero con signo con el ancho N , sin bits de relleno y una representación de complemento a dos. Por lo tanto, int8_t denota un tipo entero con signo con un ancho de exactamente 8 bits.

  2. El nombre typedef uintN_t designa un tipo entero sin signo con el ancho N . Por lo tanto, uint24_t denota un tipo entero sin signo con un ancho de exactamente 24 bits.

  3. Estos tipos son opcionales. Sin embargo, si una implementación proporciona tipos de enteros con anchos de 8, 16, 32 o 64 bits, sin bits de relleno y (para los tipos con signo) que tienen una representación de complemento a dos, se definirán los nombres typedef correspondientes.


Con respecto a la selección de tipos, algo como esto debería ser suficiente:

#ifdef INT32_IS_SHORT
    typedef short INT32
#endif
#ifdef INT32_IS_INT
    typedef int INT32
#endif
#ifdef INT32_IS_LONG
    typedef long INT32
#endif

A menos que compruebes cada plataforma con #ifdef o algo así, dudo que sea fácilmente posible. Pero muchas bibliotecas ya hacen esa tarea por ti. Para MSVC es __int8 , __int16 , & amp; c. La biblioteca GTK tiene typedefs similares.

Es posible que desee consultar pstdint.h . Es una implementación portátil de stdint.h, y no requiere soporte del compilador C99.

Por lo que yo sé, la respuesta es no. Codificamos para diferentes plataformas y solo usamos typedefs para las plataformas específicas usando # if / # else. Por ejemplo, en Win32: typedef int int32;

Siempre se podría escribir una biblioteca aritmética que usara vectores de caracteres sin signo para los números. De esa manera, podría usar números de la longitud de bits que desee, e incluso permitir que la longitud de bits varíe.

En realidad, no es necesario implementar dicha biblioteca porque GNU MP ya lo maneja.

http://gmplib.org/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top