tipos - unsigned char c
¿Cuál es la diferencia entre “int corta” e “int” en C? (9)
¿Cómo es corto int (o short) e int diferente en C? Tienen el mismo tamaño y rango. Si son esencialmente iguales, ¿de qué sirve tener dos tipos de datos?
"Un entero corto en un lenguaje de programación puede tener un tamaño diferente en un lenguaje diferente o en un procesador diferente. En algunos lenguajes, este tamaño es fijo en todas las plataformas, mientras que en otros depende de la máquina. En algunos idiomas este tipo de datos no existe en absoluto."
Depende del sistema. Algunos sistemas operativos no tendrán la misma longitud para ambos tipos.
En realidad todo depende tanto del compilador como del sistema. Pero la regla básica dice que int nunca puede ser menos que corto y nunca puede ser mayor que long.
corto <= int <= largo
En teoría / según el estándar C, podrían ser de cualquier tamaño siempre que sean short <= int
.
En el mundo real, así es como se implementan los tamaños.
CPU short int
8 bit 16 16
16 bit 16 16
32 bit 16 32
64 bit 16 32
Estaba trabajando en lo mismo hoy. Mi conclusión es que depende de la longitud de palabra de la arquitectura de la máquina en la que se ejecuta su programa. Según la documentación de C99 limits.h.
/* Minimum and maximum values a `signed short int'' can hold. */
# define SHRT_MIN (-32768)
# define SHRT_MAX 32767
/* Maximum value an `unsigned short int'' can hold. (Minimum is 0.) */
# define USHRT_MAX 65535
/* Minimum and maximum values a `signed int'' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
/* Maximum value an `unsigned int'' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
/* Minimum and maximum values a `signed long int'' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (-LONG_MAX - 1L)
/* Maximum value an `unsigned long int'' can hold. (Minimum is 0.) */
# if __WORDSIZE == 64
# define ULONG_MAX 18446744073709551615UL
# else
# define ULONG_MAX 4294967295UL
# endif
Déjame saber si alguien tiene mejor respuesta.
Nunca confíe en que un tipo de datos tenga un tamaño determinado en C. Siempre verifique los límites en limits.h si tiene dudas.
Pueden tener el mismo tamaño, pero se garantiza que int
es igual o más grande que short int
.
short e int debe tener al menos 16 bits, long debe ser de al menos 32 bits, y ese short no es más largo que int, que no es más long. Normalmente, corto es de 16 bits, largo es de 32 bits e int es de 16 o 32 bits.
Todo lo que ahora estamos seguros es que:
2 <= sizeof(short) <= sizeof(int)
5.2.4.2.1 Los tamaños de los tipos enteros <limits.h>
dan 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 Los tipos entonces dicen:
8 Para cualquiera de los dos tipos de enteros con la misma signatura y diferente rango de conversión de entero (ver 6.3.1.1), el rango de valores del tipo con menor rango de conversión de entero es un subrango de los valores del otro tipo.
y 6.3.1.1 booleanos, caracteres y enteros determinan los rangos de conversión relativos:
1 Cada tipo de entero tiene un rango de conversión de entero definido de la siguiente manera:
- El rango de long largo int será mayor que el rango de long int, que será mayor que el rango de int, que será mayor que el rango de int corto, que será mayor que el rango de char firmado.
- El rango de cualquier tipo de entero sin signo será igual al rango del tipo de entero con signo correspondiente, si corresponde.
- Para todos los tipos 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