Algunos tipos de datos como char , short int toman menos bytes que int , estos tipos de datos se promocionan automáticamente a int o int sin firmar cuando se realiza una operación en ellos. Esto se llama promoción de enteros. Por ejemplo, no se realiza ningún cálculo aritmético en tipos más pequeños como char , short y enum . Primero se convierten a int o int sin signo , y luego se realiza la aritmética sobre ellos. Si un int puede representar todos los valores del tipo original, el valor se convierte en un int . De lo contrario, se convierte en unint sin firmar
Por ejemplo, vea el siguiente programa.
#include <stdio.h> int main() { char a = 30, b = 40, c = 10; char d = (a * b) / c; printf ("%d ", d); return 0; }
Producción:
120
A primera vista, la expresión (a*b)/c parece causar un desbordamiento aritmético porque los caracteres firmados solo pueden tener valores de -128 a 127 (en la mayoría de los compiladores de C), y el valor de la subexpresión ‘(a*b) ‘ es 1200, que es mayor que 128. Pero la promoción de enteros ocurre aquí en la aritmética realizada en tipos de caracteres y obtenemos el resultado apropiado sin ningún desbordamiento.
Considere el siguiente programa como otro ejemplo .
#include <stdio.h> int main() { char a = 0xfb; unsigned char b = 0xfb; printf("a = %c", a); printf("\nb = %c", b); if (a == b) printf("\nSame"); else printf("\nNot Same"); return 0; }
Producción:
a = ? b = ? Not Same
Cuando imprimimos ‘a’ y ‘b’, se imprime el mismo carácter, pero cuando los comparamos, obtenemos el resultado «No es el mismo».
‘a’ y ‘b’ tienen la misma representación binaria que char . Pero cuando la operación de comparación se realiza en ‘a’ y ‘b’, primero se convierten a int. ‘a’ es un carácter con signo , cuando se convierte a int , su valor se convierte en -5 (valor con signo de 0xfb). ‘b’ es un char sin firmar , cuando se convierte a int , su valor se convierte en 251. Los valores -5 y 251 tienen representaciones diferentes como int , por lo que obtenemos el resultado como «No es el mismo».
Pronto discutiremos las reglas de conversión de enteros entre con y sin signo, int y long int, etc.
Referencias:
http://www.tru64unix.compaq.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_067.HTM
Este artículo es una contribución de Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA