Conversión implícita de tipos en C con ejemplos

Requisito previo: tipos de datos , conversión de tipos

La conversión implícita de tipos también se conoce como » conversión automática de tipos «. Lo hace el compilador por sí solo, sin ningún disparador externo por parte del usuario. Generalmente tiene lugar cuando en una expresión está presente más de un tipo de datos. En tal condición, la conversión de tipo (promoción de tipo) tiene lugar para evitar la pérdida de datos. Todos los tipos de datos de las variables se actualizan al tipo de datos de la variable con el tipo de datos más grande.

Hay muchas formas en las que se produce la conversión implícita de tipos en C, como por ejemplo:

  • Rango de conversión
    Se puede asignar un rango al tipo aritmético de números enteros y coma flotante , del 1 al 9 . Esta escala es teóricamente precisa, pero la implementación real no es tan fácil. Un real doble largo tiene un rango más alto que un real largo y un entero corto tiene un rango más alto que un carácter, como se muestra en la figura.
  • Conversiones en expresiones de asignación
    Hay dos operandos y un operador de asignación en una operación de asignación. La diferencia de rango decide la promoción y degradación de la expresión correcta para igualar el rango de la expresión izquierda y derecha. Promover implica que la expresión correcta es de rango inferior. Degradar implica que la expresión correcta es de mayor rango.
  • Promoción
    La promoción no crea ningún problema. El rango de expresión derecha asciende al rango de expresión izquierda. El valor de la expresión es el valor de la expresión correcta después de la promoción.

    Ejemplos:

    bool        x = true;
    char        y = ‘X’;
    int         i = 123;
    Long double d = 1234.5;
    
    y = x;   // value of y is SOH (ASCII 1)
    i = y;   // value of i is 88
    d = x;   // value of d is 1.0
    d = i;   // value of d is 1234.0
    
    *Here SOH is Start of Header
    
  • Degradación La degradación
    puede o no crear problemas. Si el tamaño de la variable de la expresión de la izquierda puede acomodar el valor de la expresión, no surge ningún problema, pero los resultados pueden ser un poco diferentes de los esperados. Cualquier valor real o entero se puede asignar a la variable booleana. Si el valor de la expresión de la derecha es cero , implica que se almacena false(0) . Y si el valor es distinto de cero, es decir, positivo o negativo, implica que se almacena true(1) .

    Cuando se asigna un valor entero o real a una variable de carácter, el byte menos significativo del número se convierte en un carácter y se almacena. Cuando se almacena un valor real en una variable entera, solo se asigna la parte entera y se descarta la fracción. Pero si el valor entero es mayor que el valor máximo que se puede almacenar, se obtienen resultados impredecibles.

    Del mismo modo, si un valor doble largo se almacena en una variable de tipo flotante, los resultados son válidos solo si el valor se ajusta; de lo contrario , los valores muy grandes se vuelven inválidos .
    Ejemplos:

    bool  b = false;
    char  c = ‘X’;
    short s = 98;
    int   j = INT_MAX;
    int   k = 88;
    
    b = c;     // value of b is 1 (true)
    s = j;     // value of s is unpredictable
    c = k + 1; // demotion: value of c is ‘Y’
    
  • Conversiones en otras expresiones binarias
    Hay diferentes conjuntos de reglas para otras expresiones binarias y, a veces, se vuelven complicadas, por lo que resumirlas en pasos:
    1. El operando con el rango más alto se determina utilizando el ranking como se muestra en la figura anterior.
    2. El operando de menor rango se eleva al rango definido en el paso 1.
    3. La operación se realiza con el valor de la expresión que tiene el tipo del rango promocionado.

    Ejemplos:

    bool        x = true;
    char        y = ‘X’;
    int         i = 123;
    short       s = 98;
    long double d = 1234.5678;
    
    x + y;   // b is promoted, result is ‘Y’ (‘X’ + 1)
    i * s;   // result is an int
    d * c;   // result is long double
    

A continuación se muestra un ejemplo para demostrar la conversión implícita de tipos de tipos numéricos para una mejor comprensión.

// C program to demonstrate Implicit
// Type Conversion of numeric types
  
#include <stdbool.h>
#include <stdio.h>
  
int main(void)
{
    // Local Declarations
    bool b = true;
    char c = 'X';
    float d = 1234.5;
    int i = 123;
    short s = 98;
  
    // Statements
    printf("bool + char is char:     %c\n", b + c);
    printf("int * short is int:      %d\n", i * s);
    printf("float * char is float:   %f\n", d * c);
  
    // bool promoted to char
    c = c + b;
  
    // char promoted to float
    d = d + c;
  
    b = false;
  
    // float demoted to bool
    b = -d;
  
    printf("\nAfter execution \n");
    printf("char + true:     %c\n", c);
    printf("float + char:    %f\n", d);
    printf("bool = -float:   %d\n", b);
  
    return 0;
}
Producción:

bool + char is char:     Y
int * short is int:      12054
float * char is float:   108636.000000

After execution 
char + true:     Y
float + char:    1323.500000
bool = -float:   1

Publicación traducida automáticamente

Artículo escrito por ranadeepika2409 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 *