Conversión de tipos en C: conversión implícita y explícita

⚡ Resumen inteligente

En C, la conversión de tipos transforma un tipo de dato en otro, ya sea de forma implícita cuando el compilador promueve automáticamente un tipo compatible más pequeño o de forma explícita cuando un programador fuerza la conversión con un operador de conversión para controlar la precisión y evitar resultados inesperados.

  • 🔄 Dos formas: La conversión implícita se ejecuta automáticamente; la conversión explícita se escribe con un operador de conversión.
  • ⬆️ Tipo de promoción: Al convertir un tipo de dato más pequeño a uno compatible más grande, como de tipo short a int, se conserva el valor.
  • ✂️ Riesgo de pérdida de datos: Reducir las conversiones, como de float a int, elimina la fracción y pierde significado.
  • 🎯 Sintaxis explícita: Escribir una expresión (tipo-nombre) fuerza una conversión, como convertir operandos enteros a flotantes.
  • 🤖 Asistencia de IA: Los asistentes de IA y GitHub Copilot elaboran expresiones de casting e identifican conversiones de estrechamiento riesgosas.

Tipografía en C

¿Qué es el encasillamiento en C?

El encasillamiento consiste en convertir un tipo de datos en otro. También se le llama conversión de datos o conversión de tipos en lenguaje C. Es uno de los conceptos importantes introducidos en la programación 'C'.

La programación 'C' proporciona dos tipos de operaciones de conversión de tipos:

  • Conversión de tipos implícitos
  • Conversión de tipo explícito

Conversión de tipos implícitos

La conversión implícita de tipos significa la conversión de tipos de datos sin perder su significado original. Este tipo de conversión de tipos es esencial cuando se desea cambiar los tipos de datos sin cambiar el significado de los valores almacenados en el interior. variable.

La conversión de tipo implícita en C se produce automáticamente cuando se copia un valor a su tipo de datos compatible. Durante la conversión, se aplican reglas estrictas para la conversión de tipo. Si los operandos son de dos tipos de datos diferentes, entonces un operando que tenga un tipo de datos inferior se convierte automáticamente en un tipo de datos superior. Este tipo de conversión de tipo se puede ver en el siguiente ejemplo.

#include<stdio.h>
int main(){
	short a=10; //initializing variable of short data type
	int b; //declaring int variable
	b=a; //implicit type casting
	printf("%d\n",a);
	printf("%d\n",b);
}

Salida:

10
10

Conversión de tipos implícitos

  1. En el ejemplo dado, hemos declarado una variable de tipo de datos corto con un valor inicializado como 10.
  2. En la segunda línea, hemos declarado una variable de tipo de datos int.
  3. En la tercera línea, hemos asignado el valor de la variable s a la variable a. En la tercera línea, la conversión de tipo implícita se realiza cuando el valor de la variable s, que es de tipo de datos corto, se copia en la variable a, que es de tipo de datos int.

Convertir carácter a int

Considere el ejemplo de agregar un carácter decodificado en ASCII con un número entero:

#include <stdio.h>
main() {
   int  number = 1;
   char character = 'k'; /*ASCII value is 107 */
   int sum;
   sum = number + character;
   printf("Value of sum : %d\n", sum );
}

Salida:

 Value of sum : 108

Aquí, el compilador ha realizado una promoción de números enteros convirtiendo el valor de 'k' a ASCII antes de realizar la operación de suma real.

Jerarquía de conversión aritmética

El compilador primero procede a convertir un carácter en un entero. Si los operandos aún tienen tipos de datos diferentes, se convierten al tipo de datos más alto que aparece en el siguiente diagrama de jerarquía:

Jerarquía de conversión aritmética

Considere el siguiente ejemplo para comprender el concepto:

#include <stdio.h>
main() {
   int  num = 13;
   char c = 'k'; /* ASCII value is 107 */
   float sum;
   sum = num + c;
   printf("sum = %f\n", sum );}

Salida:

 sum = 120.000000

En primer lugar, la variable c se convierte a entero, pero el compilador convierte num y c a "flotante" y los suma para producir un resultado "flotante".

Puntos importantes sobre las conversiones implícitas

  • El tipo implícito de conversión de tipos también se denomina conversión de tipos estándar. No requerimos ninguna palabra clave ni declaraciones especiales en la conversión de tipos implícita.
  • La conversión de un tipo de dato menor a uno mayor también se denomina promoción de tipo. En el ejemplo anterior, podemos decir que el valor de s se ha convertido al tipo entero.
  • La conversión de tipo implícita siempre ocurre con los tipos de datos compatibles.

No podemos realizar una conversión de tipos implícita en tipos de datos que no son compatibles entre sí, como por ejemplo:

  1. La conversión de float a int truncará la parte fraccionaria y, por lo tanto, perderá el significado del valor.
  2. Al convertir un número doble a un número flotante, se redondearán los dígitos.
  3. Convertir un entero largo a un entero provocará una caídaping de bits de orden superior excedentes.

En todos los casos anteriores, cuando convertimos los tipos de datos, el valor perderá su significado. Generalmente, el compilador advierte de la pérdida de significado del valor.

Programación 'C' proporciona otra forma de encasillamiento que es la conversión de tipos explícita.

Conversión de tipo explícito

En la conversión de tipos implícita, el tipo de datos se convierte automáticamente. Hay algunos escenarios en los que es posible que tengamos que forzar la conversión de tipos. Supongamos que tenemos una variable div que almacena la división de dos operandos que se declaran como tipo de datos int.

 int result, var1=10, var2=3;
result=var1/var2;

En este caso, después de la división realizada en las variables var1 y var2 el resultado almacenado en la variable “resultado” estará en formato entero. Cuando esto sucede, el valor almacenado en la variable “resultado” pierde su significado porque no considera la parte fraccionaria que normalmente se obtiene en la división de dos números.

Para forzar la conversión de tipos en tales situaciones, utilizamos la conversión de tipos explícita.

Requiere un operador de fundición tipográfica. La sintaxis general para las operaciones de conversión de tipos es la siguiente:

(type-name) expression

Aquí,

  • El nombre del tipo es el tipo de datos estándar del lenguaje "C".
  • Una expresión puede ser una constante, una variable o una expresión real.

Escribamos un programa para demostrar cómo encasillar en C con encasillamiento explícito.

#include<stdio.h>
int main()
{
	float a = 1.2;
	//int b  = a; //Compiler will throw an error for this
	int b = (int)a + 1;
	printf("Value of a is %f\n", a);
	printf("Value of b is %d\n",b);
	return 0;
}

Salida:

Value of a is 1.200000
Value of b is 2

Conversión de tipo explícito

  1. Hemos inicializado una variable 'a' de tipo float.
  2. A continuación, tenemos otra variable 'b' de tipo entero. Dado que las variables 'a' y 'b' son de tipos de datos diferentes, 'C' no permitirá el uso de dicha expresión y generará un error. En algunas versiones de 'C', la expresión se evaluará, pero el resultado no será el deseado.
  3. Para evitar este tipo de situaciones, hemos encasillado la variable 'a' de tipo float. Al utilizar métodos de conversión de tipos explícitos, hemos convertido con éxito float en un tipo de datos entero.
  4. Hemos impreso el valor de 'a' que todavía es flotante
  5. Después del encasillamiento, el resultado siempre será un número entero "b".

De esta manera, podemos implementar la conversión de tipos explícita en la programación C.

Preguntas Frecuentes

La conversión de tipos es el cambio automático del compilador; la conversión de tipos es el cambio explícito que se solicita con un operador de conversión. La conversión de tipos es una forma de conversión.

Sí, es posible. Convertir float a int trunca la fracción, convertir double a float redondea los dígitos y convertir long a int descarta los bits de orden superior. Las conversiones de tipo ampliadas se mantienen seguras.

Sí. C permite convertir un tipo de puntero a otro, y los punteros a objetos se convierten a void* y viceversa. Desreferenciar un puntero convertido de forma incompatible provoca un comportamiento indefinido.

C solo tiene la conversión de tipo (valor) al estilo C. C++ Agrega cuatro conversiones con nombre más seguras —static_cast, dynamic_cast, const_cast y reinterpret_cast— con una intención más clara y verificada por el compilador.

El valor conserva únicamente sus bits de menor orden. Si es demasiado grande, el resultado se desborda o cambia de signo, por lo que conviene comprobar primero que se ajusta al rango objetivo.

Prefiera las conversiones de tipo ampliadas, confirme que un valor se ajusta antes de reducirlo y convierta un operando a flotante antes de la división entera. Active las advertencias del compilador para señalar las conversiones riesgosas.

Sí. Un asistente de IA genera expresiones de conversión a partir de una solicitud, explica las reglas de promoción y advierte cuando una conversión puede provocar la pérdida de datos. Siempre compile y pruebe el resultado.

Copiloto de GitHub sugiere expresiones de conversión implícitas y explícitas a partir de un comentario, incluida la sintaxis (tipo-nombre). RevRevisa cada sugerencia sobre la posible pérdida de datos antes de compilar.

Resumir este post con: