Pregunta

¿Cuál es la mejor manera de declarar un tipo entero que siempre es de 4 bytes en cualquier plataforma? No me preocupo por ciertos dispositivos o máquinas antiguas que tienen int.

de 16 bits
¿Fue útil?

Solución

#include <stdint.h>

int32_t my_32bit_int;

Otros consejos

C no se preocupa mucho por los tamaños exactos de los tipos enteros, C99 presenta el encabezado stdint.h , que es probablemente su mejor apuesta. Incluya eso y puede usar p. int32_t. Por supuesto, no todas las plataformas pueden soportar eso.

La respuesta de Corey es correcta para " best " ;, en mi opinión, pero un simple " int " también funcionará en la práctica (dado que ignora los sistemas con int de 16 bits). En este punto, tanto código depende de que int sea de 32 bits que los proveedores del sistema no lo van a cambiar.

(Vea también por qué long es de 32 bits en muchos sistemas de 64 bits y por qué tenemos " long long " ;.)

¡Sin embargo, uno de los beneficios de usar int32_t es que no estás perpetuando este problema!

Puede buscar una copia de Brian Gladman brg_types.h si no tiene stdint.h.

<=> descubrirá los tamaños de los distintos enteros en su plataforma y creará typedefs para los tamaños comunes: 8, 16, 32 y 64 bits.

Debe incluir inttypes.h en lugar de stdint.h porque long no está disponible en algunas plataformas como Solaris, y int incluirá <=> para usted en sistemas como Linux. Si incluye <=> su código es más portátil entre Linux y Solaris.

Este enlace explica lo que digo:

Y este enlace tiene una tabla que muestra por qué no desea utilizar <=> o <=> si tiene la intención de que haya cierto número de bits en su tipo de datos. Enlace de IBM sobre tipos de datos portátiles

Si stdint.h no está disponible para su sistema, haga el suyo. Siempre tengo un archivo llamado & Quot; types.h & Quot; que tienen typedefs para todos los valores de 8, 16 y 32 bits con signo / sin signo.

también, dependiendo de las plataformas de destino, puede usar herramientas automáticas para su sistema de compilación

verá si stdint.h / inttypes.h existe y si no lo hacen, creará los typedefs apropiados en un " config.h "

stdint.h es la opción obvia, pero no está necesariamente disponible.

Si está utilizando una biblioteca portátil, es posible que ya proporcione enteros portátiles de ancho fijo. Por ejemplo, SDL tiene Sint32 (S es para & # 8220; firmado & # 8221;), y GLib tiene gint32.

C99 o posterior

Use <stdint.h>.

Si su implementación admite enteros de 32 bits complementarios de 2, entonces debe definir int32_t.

Si no es así, la siguiente mejor opción es int_least32_t, que es un tipo entero compatible con la implementación que tiene al menos 32 bits, independientemente de la representación (complemento de dos, complemento de uno, etc.).

También hay int_fast32_t que es un tipo entero de al menos 32 bits de ancho, elegido con la intención de permitir las operaciones más rápidas para ese requisito de tamaño.

ANSI C

Puede usar long, que tiene una garantía de al menos 32 bits de ancho como resultado de los requisitos de rango mínimo especificados por el estándar.

Si prefiere usar el tipo entero más pequeño para ajustar un número de 32 bits, puede usar declaraciones de preprocesador como las siguientes con las macros definidas en <limits.h>:

#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

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