¿Cuándo ocurre que un entero con signo no puede representar todos los valores del tipo original con respecto a la promoción entera?Promoción integral
Desde el texto K & R, C Programming Language, 2nd Ed. pag. 174
A.6.1 Promoción Integral
un personaje, un entero corto, o un campo de bits número entero, todo firmado o no, o un objeto de tipo de enumeración, se puede utilizar en una expresión siempre que se pueda usar un número entero. Si un int puede representar todos los valores del tipo original, entonces el valor se convierte en int; de lo contrario, el valor se convierte en unsigned int. Este proceso se llama promoción integral.
Este código de muestra de los límites de los tipos de mi sistema:
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("CHAR_MAX: %i\n", CHAR_MAX);
printf("UCHAR_MAX: %i\n", UCHAR_MAX);
printf("SHORT_MAX: %i\n", SHRT_MAX);
printf("USHORT_MAX: %i\n", USHRT_MAX);
printf("INT_MAX: %i\n", INT_MAX);
printf("UINT_MAX: %u\n", UINT_MAX);
return 0;
}
El resultado es:
CHAR_MAX: 127
UCHAR_MAX: 255
SHORT_MAX: 32767
USHORT_MAX: 65535
INT_MAX: 2147483647
UINT_MAX: 4294967295
El tipo int firmado es mucho más grande que cualquiera de los otros tipos, Entonces, ¿cuándo volvería a caer en UINT_MAX?
Los valores que acaba de imprimir pueden ser diferentes en diferentes sistemas. Simplemente está garantizado, que un corto es <= int y un int es <= un largo, por ejemplo. Por lo tanto, short e int podrían tener el mismo tamaño. La publicación de @ minitech es correcta – guitarflow