¿El tamaño de C "int" es 2 bytes o 4 bytes?
¿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.
Sé que es igual a sizeof(int)
. El tamaño de an int
depende realmente del compilador. En el pasado, cuando los procesadores eran de 16 bits, int
eran 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 int
tiene 8 bytes en la mayoría de los sistemas de 64 bits. Por ejemplo, son 4 bytes en GCC de 64 bits.
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. int
Se garantiza que podrá contener -32767 a 32767, lo que requiere 16 bits. En ese caso, int
son 2 bytes. Sin embargo, las implementaciones son libres de ir más allá de ese mínimo, como verá que muchos compiladores modernos generan int
32 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 sizeof
operador 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_t
o 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).
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 int
era 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 int
incluso en plataformas de 64 bits.
Sin embargo , la época de los 2 bytes int
ya 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.
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
Borrador estándar C99 N1256
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
El tamaño int
y 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.