Promociones enteras en C

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *