¿El tamaño de C "int" es 2 bytes o 4 bytes?

Resuelto Rajiv Prathap asked hace 12 años • 0 respuestas

¿Una variable entera en C ocupa 2 bytes o 4 bytes? ¿Cuáles son los factores de los que depende?

La mayoría de los libros de texto dicen que las variables enteras ocupan 2 bytes. Pero cuando ejecuto un programa que imprime las direcciones sucesivas de una serie de números enteros, muestra la diferencia de 4.

Rajiv Prathap avatar Jul 12 '12 01:07 Rajiv Prathap
Aceptado

Sé que es igual a sizeof(int). El tamaño de an intdepende realmente del compilador. En el pasado, cuando los procesadores eran de 16 bits, interan de 2 bytes. Hoy en día, la mayoría de las veces son 4 bytes en sistemas de 32 y 64 bits.

Aún así, usar sizeof(int)es la mejor manera de obtener el tamaño de un número entero para el sistema específico en el que se ejecuta el programa.

EDITAR: Se corrigió la declaración incorrecta que inttiene 8 bytes en la mayoría de los sistemas de 64 bits. Por ejemplo, son 4 bytes en GCC de 64 bits.

yhyrcanus avatar Jul 11 '2012 18:07 yhyrcanus

Este es uno de los puntos de C que puede resultar confuso al principio, pero el estándar C sólo especifica un rango mínimo para tipos de enteros cuyo soporte está garantizado. intSe garantiza que podrá contener -32767 a 32767, lo que requiere 16 bits. En ese caso, intson 2 bytes. Sin embargo, las implementaciones son libres de ir más allá de ese mínimo, como verá que muchos compiladores modernos generan int32 bits (lo que también significa 4 bytes de manera bastante ubicua).

La razón por la que su libro dice 2 bytes probablemente sea porque es antiguo. Hubo un tiempo en que esta era la norma. En general, siempre debes utilizar el sizeofoperador si necesitas saber cuántos bytes hay en la plataforma que estás utilizando.

Para solucionar esto, C99 agregó nuevos tipos en los que puede solicitar explícitamente un número entero de cierto tamaño, por ejemplo int16_to int32_t. Antes de eso, no existía una forma universal de obtener un número entero de un ancho específico (aunque la mayoría de las plataformas proporcionaban tipos similares por plataforma).

FatalError avatar Jul 11 '2012 18:07 FatalError

No hay una respuesta específica. Depende de la plataforma. Está definido por la implementación. Pueden ser 2, 4 o algo más.

La idea detrás intera que se suponía que coincidiera con el tamaño natural de "palabra" en la plataforma dada: 16 bits en plataformas de 16 bits, 32 bits en plataformas de 32 bits, 64 bits en plataformas de 64 bits, ya se entiende la idea. Sin embargo, por motivos de compatibilidad con versiones anteriores, algunos compiladores prefieren utilizar 32 bits intincluso en plataformas de 64 bits.

Sin embargo , la época de los 2 bytes intya pasó (¿plataformas de 16 bits?) A menos que esté utilizando alguna plataforma integrada con un tamaño de palabra de 16 bits. Probablemente tus libros de texto sean muy antiguos.

AnT stands with Russia avatar Jul 11 '2012 18:07 AnT stands with Russia

La respuesta a esta pregunta depende de la plataforma que esté utilizando.
Pero independientemente de la plataforma, se pueden asumir con seguridad los siguientes tipos:

 [8-bit] signed char: -127 to 127
 [8-bit] unsigned char: 0 to 255
 [16-bit]signed short: -32767 to 32767
 [16-bit]unsigned short: 0 to 65535
 [32-bit]signed long: -2147483647 to 2147483647
 [32-bit]unsigned long: 0 to 4294967295
 [64-bit]signed long long: -9223372036854775807 to 9223372036854775807
 [64-bit]unsigned long long: 0 to 18446744073709551615
Priyank Arora avatar Mar 14 '2014 12:03 Priyank Arora

Borrador estándar C99 N1256

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

El tamaño inty todos los demás tipos de enteros están definidos por la implementación, C99 solo especifica:

  • garantías de tamaño mínimo
  • tamaños relativos entre los tipos

5.2.4.2.1 "Tamaños de tipos enteros <limits.h>" proporciona los tamaños mínimos:

1 [...] Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) a los mostrados [...]

  • UCHAR_MAX 255 // 2 8 − 1
  • USHRT_MAX 65535 // 2 16 - 1
  • UINT_MAX 65535 // 2 16 - 1
  • ULONG_MAX 4294967295 // 2 32 − 1
  • ULLONG_MAX 18446744073709551615 // 2 64 − 1

6.2.5 "Tipos" luego dice:

8 Para dos tipos de enteros cualesquiera con el mismo signo y diferente rango de conversión de enteros (ver 6.3.1.1), el rango de valores del tipo con menor rango de conversión de enteros es un subrango de los valores del otro tipo.

y 6.3.1.1 "Booleanos, caracteres y enteros" determina los rangos de conversión relativos:

1 Cada tipo de entero tiene un rango de conversión de enteros definido de la siguiente manera:

  • El rango de long long int será mayor que el rango de long int, que será mayor que el rango de int, que será mayor que el rango de short int, que será mayor que el rango de char firmado.
  • El rango de cualquier tipo entero sin signo será igual al rango del tipo entero con signo correspondiente, si lo hubiera.
  • Para todos los tipos de enteros T1, T2 y T3, si T1 tiene un rango mayor que T2 y T2 tiene un rango mayor que T3, entonces T1 tiene un rango mayor que T3.