Pregunta

Esto está relacionado con la siguiente pregunta,

Cómo declarar un entero de 32 bits en C

Varias personas mencionaron que int es siempre de 32 bits en la mayoría de las plataformas. Tengo curiosidad si esto es cierto.

¿Conoces alguna plataforma moderna con int de diferente tamaño? Ignora las plataformas de dinosaurios con arquitecturas de 8 bits o 16 bits.

NOTA: Ya sé cómo declarar un entero de 32 bits a partir de la otra pregunta. Esta es más como una encuesta para descubrir qué plataformas (CPU / OS / Compilador) admiten enteros con otros tamaños.

¿Fue útil?

Solución

Como varias personas han declarado, no hay garantías de que un 'int' sea de 32 bits, si desea usar variables de un tamaño específico, particularmente al escribir código que involucra manipulaciones de bits, debe usar el 'Entero estándar Tipos 'exigidos por la especificación c99.

int8_t
uint8_t
int32_t
uint32_t

etc ...

generalmente tienen la forma [u] intN_t, donde la 'u' especifica que desea una cantidad sin signo, y N es el número de bits

los typedefs correctos para estos deberían estar disponibles en stdint.h en cualquier plataforma para la que esté compilando, el uso de estos le permite escribir un código agradable y portátil :-)

Otros consejos

" es siempre 32 bits en most plataformas " - ¿Qué hay de malo con ese fragmento? :-)

El estándar C no exige los tamaños de muchos de sus tipos integrales. exige tamaños relativos, por ejemplo, sizeof (int) > = sizeof (short) y así sucesivamente. También exige rangos mínimos pero permite múltiples esquemas de codificación (complemento de dos, complemento de unos y signo / magnitud).

Si desea una variable de tamaño específico, debe usar una adecuada para la plataforma en la que se está ejecutando, como el uso de #ifdef , algo como:

#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

Alternativamente, C99 y superior permiten tipos enteros de ancho exacto intN_t y uintN_t :


  1. El typedef nombre intN_t designa un tipo entero con signo con ancho N , sin bits de relleno y una representación complementaria de dos. Por lo tanto, int8_t denota un tipo entero con signo con un ancho de exactamente 8 bits.
  2. El typedef nombre uintN_t designa un tipo entero sin signo con 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 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 complementaria de dos, definirá el correspondiente typedef nombres.

En este momento, la mayoría de las plataformas de escritorio y servidor usan enteros de 32 bits, e incluso muchas plataformas integradas (piense en ARM de mano o x86) usan 32code int s. Para llegar a un int de 16 bits, debe ser muy pequeño: piense " Berkeley mote " o algunos de los chips Atmel Atmega más pequeños. Pero están ahí afuera.

No. Los pequeños sistemas integrados utilizan enteros de 16 bits.

Depende mucho de tu compilador. Algunos los compilan como máquinas de 64 bits en máquinas de 64 bits, otros los compilan como 32 bits. Los sistemas integrados son su propia pequeña bola especial de cera.

Lo mejor que puede hacer para verificar:

printf("%d\n", sizeof(int));

Tenga en cuenta que sizeof imprimirá bytes. Haga sizeof (int) * CHAR_BIT para obtener bits.

Código para imprimir el número de bits para varios tipos:

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}

Bueno, la mayoría de los procesadores basados ??en ARM pueden ejecutar el código Thumb, que es un modo de 16 bits. Eso incluye los portátiles Android que aún se rumorean y los teléfonos inteligentes de última generación.

Además, algunas calculadoras gráficas usan procesadores de 8 bits, y yo también los llamaría bastante modernos.

TI todavía está vendiendo placas OMAP con los DSP C55x, principalmente utilizados para decodificación de video. Creo que el compilador suministrado para esto tiene un int de 16 bits. No es un dinosaurio (el Nokia 770 se lanzó en 2005), aunque puede obtener DSP de 32 bits.

La mayoría del código que escribes, puedes asumir con seguridad que nunca se ejecutará en un DSP. Pero tal vez no todos.

Si también está interesado en el valor máximo / mínimo real en lugar de en la cantidad de bits, limit.h contiene prácticamente todo lo que quieres saber.

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