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:- El operando con el rango más alto se determina utilizando el ranking como se muestra en la figura anterior.
- El operando de menor rango se eleva al rango definido en el paso 1.
- 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; }
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