2009-08-05 12 views
18

Esto se relaciona con la pregunta siguiente,¿Está int en C siempre de 32 bits?

How to Declare a 32-bit Integer in C

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

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

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

+10

Hay procesadores modernos de 8 y 16 bits, pero no en el entorno de PC. – Gerhard

Respuesta

39

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

int8_t 
uint8_t 
int32_t 
uint32_t 

etc ...

Por lo general son de 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, usar estos le permite escribir código agradable y portátil :-)

+0

+1 simple, limpio, simplemente funciona;) –

+0

+1, vaya con esto. – nielsj

+5

Buena respuesta, simplemente no a la pregunta :) – Christoffer

2

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

Lo mejor que puede hacer para comprobar:

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

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

código para imprimir el número de bits de 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; 
} 
+0

Esto está mal en muchas dimensiones. En primer lugar, 'sizeof' puede operar en tipos, por lo que no es necesario' randomint'. En segundo lugar, 'CHAR_BITS' no garantiza que sea ocho. Hay algunas cosas más, pero estos son los errores relacionados con la pregunta. –

+0

Cierto, no siempre 8 bits en un byte –

+0

@Eric its 'CHAR_BIT'. Lo escribí mal en mi comentario. –

12

"es siempre de 32 bits en más plataformas" - lo que está mal con ese fragmento? :-)

El estándar C no exige el tamaño de sus variables. Es hace tamaños relativos de mandato, por ejemplo, sizeof(int) >= sizeof(short) y así sucesivamente. También exige intervalos mínimos, pero permite múltiples esquemas de codificación (complemento de dos, complemento de uno, y signo/magnitud).

Si desea un tamaño variable específica, es necesario utilizar una adecuada para la plataforma que se está ejecutando en, tales como el uso de #ifdef 's, algo así 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 permite para este tipo de anchura enteros exactas intN_t y uintN_t:


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

Muéstremelo :) Confiar en el tamaño de una variable incorporada en C o C++ es intrínsecamente un error. – kyoryu

+6

El estándar C ordena intervalos mínimos (lo que implica tamaños mínimos). El rango mínimo de int es -32767 a +32767, y el rango mínimo de largo es -2147483647 a +2147483647. – caf

+3

(lo que significa que si solo desea una variable que pueda almacenar el rango de un entero de 32 bits, use long o unsigned long, no se requiere bodginess de preprocesador). – caf

2

No. Los sistemas integrados pequeños usan números enteros de 16 bits.

5

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

+0

¡Sí, la única respuesta que en realidad responde a la pregunta! Sin embargo, sería muy bueno saber dónde obtuviste esa respuesta y los compiladores/plataformas específicos que usan 32 bits, o tal vez solo aquellos que NO usan 32 bits. –

1

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 solo se rumoreaban y los teléfonos inteligentes de última generación.

Además, algunas calculadoras utilizan procesadores de 8 bits, y los llamaría bastante modernos.

+2

No puede tener una implementación C conforme con 8 bit int, por lo que incluso si esas calculadoras son de 8 bits, si tienen un compilador C, entonces debe hacer que int sea al menos 16 bit. –

+0

Ah, eso es correcto. – Christoffer

+0

El código de pulgar aún usa int de 32 bits; el aspecto '16-bit 'es solo el tamaño de las instrucciones codificadas. –

1

TI siguen vendiendo tarjetas OMAP con los DSP C55x, utilizados principalmente para la decodificación de video. Creo que el compilador suministrado para esto tiene un int de 16 bits. No es un dinosaurio (el Nokia 770 fue lanzado en 2005), aunque puedes obtener DSP de 32 bits.

La mayor parte del código que escribe, puede asumir con seguridad que nunca se ejecutará en un DSP. Pero quizás no todo.

0

Si también está interesado en el valor máximo/mínimo real en lugar del número de bits, limits.h contiene prácticamente todo lo que desea saber.

Cuestiones relacionadas