Conversão de tipos em C: conversão implícita e explícita

⚡ Resumo Inteligente

A conversão de tipos em C transforma um tipo de dado em outro, seja implicitamente, quando o compilador promove automaticamente um tipo compatível menor, ou explicitamente, quando um programador força a conversão com um operador de conversão para controlar a precisão e evitar resultados inesperados.

  • 🔄 Duas formas: A conversão implícita é executada automaticamente; a conversão explícita é escrita com um operador de conversão.
  • ⬆️ Tipo de promoção: Converter um tipo menor para um tipo maior compatível, como de short para int, preserva o valor.
  • ✂️ Risco de perda de dados: Converter valores como float para int elimina a fração e perde o significado.
  • 🎯 Sintaxe explícita: Escrever uma expressão (nome-do-tipo) força uma conversão, como converter operandos inteiros em float.
  • 🤖 Assistência de IA: Assistentes de IA e o GitHub Copilot elaboram expressões de conversão e sinalizam conversões de estreitamento de risco.

Fundição de tipos em C

O que é conversão de tipo em C?

Typecasting é converter um tipo de dados em outro. Também é chamado de conversão de dados ou conversão de tipo na linguagem C. É um dos conceitos importantes introduzidos na programação 'C'.

A programação 'C' fornece dois tipos de operações de conversão de tipo:

  • Cast de tipo implícito
  • Casting de tipo explícito

Cast de tipo implícito

A conversão implícita de tipos significa a conversão de tipos de dados sem perder seu significado original. Esse tipo de conversão é essencial quando você deseja alterar os tipos de dados sem alterar o significado dos valores armazenados. variável.

A conversão implícita de tipo em C acontece automaticamente quando um valor é copiado para seu tipo de dados compatível. Durante a conversão, são aplicadas regras estritas para conversão de tipo. Se os operandos forem de dois tipos de dados diferentes, então um operando com tipo de dados inferior será automaticamente convertido em um tipo de dados superior. Este tipo de conversão de tipo pode ser visto no exemplo a seguir.

#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);
}

Saída:

10
10

Cast de tipo implícito

  1. No exemplo dado, declaramos uma variável de tipo de dados curto com valor inicializado como 10.
  2. Na segunda linha, declaramos uma variável do tipo de dados int.
  3. Na terceira linha, atribuímos o valor da variável s à variável a. Na terceira linha, a conversão implícita de tipo é executada à medida que o valor da variável s, que é do tipo de dados curto, é copiado para a variável a, que é do tipo de dados int.

Convertendo Caractere em Int

Considere o exemplo de adição de um caractere decodificado em ASCII com um número inteiro:

#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 );
}

Saída:

 Value of sum : 108

Aqui, o compilador fez uma promoção de número inteiro convertendo o valor de 'k' em ASCII antes de executar a operação de adição real.

Hierarquia de conversão aritmética

O compilador primeiro prossegue promovendo um caractere a um número inteiro. Se os operandos ainda possuírem tipos de dados diferentes, eles serão convertidos para o tipo de dados mais alto que aparece no seguinte gráfico hierárquico:

Hierarquia de conversão aritmética

Considere o seguinte exemplo para entender o conceito:

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

Saída:

 sum = 120.000000

Primeiramente, a variável c é convertida para inteiro, mas o compilador converte num e c em "float" e as soma para produzir um resultado do tipo 'float'.

Pontos importantes sobre conversões implícitas

  • O tipo implícito de conversão de tipo também é chamado de conversão de tipo padrão. Não exigimos nenhuma palavra-chave ou instruções especiais na conversão implícita de tipo.
  • A conversão de um tipo de dados menor para um tipo de dados maior também é chamada de promoção de tipo. No exemplo acima, podemos dizer que o valor de `s` foi promovido para o tipo inteiro.
  • A conversão implícita de tipo sempre acontece com os tipos de dados compatíveis.

Não podemos realizar a conversão implícita de tipos em tipos de dados que não são compatíveis entre si, como:

  1. A conversão de float em um int truncará a parte fracionária, perdendo assim o significado do valor.
  2. A conversão de double em float arredondará os dígitos.
  3. Converter um inteiro longo para um inteiro causará uma queda de valor.ping de bits de ordem superior em excesso.

Em todos os casos acima, ao convertermos os tipos de dados, o valor perderá o significado. Geralmente, a perda de significado do valor é avisada pelo compilador.

Programação 'C' fornece outra maneira de conversão de tipo, que é a conversão de tipo explícita.

Casting de tipo explícito

Na conversão implícita de tipo, o tipo de dados é convertido automaticamente. Existem alguns cenários em que podemos ter que forçar a conversão de tipo. Suponha que temos uma variável div que armazena a divisão de dois operandos que são declarados como um tipo de dados int.

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

Neste caso, após a divisão realizada nas variáveis ​​var1 e var2 o resultado armazenado na variável “resultado” estará no formato inteiro. Sempre que isso acontece, o valor armazenado na variável “resultado” perde o sentido porque não considera a parte fracionária que normalmente é obtida na divisão de dois números.

Para forçar a conversão de tipo em tais situações, usamos conversão de tipo explícita.

Requer um operador de conversão de tipo. A sintaxe geral para operações de conversão de tipo é a seguinte:

(type-name) expression

Aqui,

  • O nome do tipo é o tipo de dados padrão da linguagem 'C'.
  • Uma expressão pode ser uma constante, uma variável ou uma expressão real.

Vamos escrever um programa para demonstrar como fazer conversão de tipo em C com conversão de tipo explícita.

#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;
}

Saída:

Value of a is 1.200000
Value of b is 2

Casting de tipo explícito

  1. Inicializamos uma variável 'a' do tipo float.
  2. Em seguida, temos outra variável 'b' do tipo inteiro. Como as variáveis ​​'a' e 'b' são de tipos de dados diferentes, a linguagem 'C' não permite o uso dessa expressão e resultará em um erro. Em algumas versões de 'C', a expressão será avaliada, mas o resultado não será o desejado.
  3. Para evitar tais situações, tipificamos a variável 'a' do tipo float. Usando métodos explícitos de conversão de tipo, convertemos float com sucesso em tipo de dados inteiro.
  4. Imprimimos o valor de 'a' que ainda é um float
  5. Após a conversão de tipo, o resultado sempre será um número inteiro 'b.'

Desta forma, podemos implementar a conversão explícita de tipos na programação C.

Perguntas Frequentes

A conversão de tipo é a alteração automática feita pelo compilador; a conversão explícita de tipo (ou casting) é a alteração que você solicita com um operador de conversão. A conversão explícita é uma forma de conversão.

Sim, é possível. A conversão de float para int trunca a fração, a conversão de double para float arredonda os dígitos e a conversão de long para int descarta os bits mais significativos. As conversões de tipo com alargamento permanecem seguras.

Sim. Em C, você pode converter um tipo de ponteiro para outro, e ponteiros de objeto podem ser convertidos para `void*` e vice-versa. A desreferenciação de um ponteiro convertido de forma incompatível causa comportamento indefinido.

A linguagem C possui apenas a conversão de valor (tipo) no estilo C. C++ Adiciona quatro conversões de tipo nomeadas mais seguras — static_cast, dynamic_cast, const_cast e reinterpret_cast — com intenções mais claras e verificadas pelo compilador.

O valor mantém apenas os bits menos significativos. Se for muito grande, o resultado sofre inversão de sentido ou troca de sinal, portanto, verifique primeiro se ele se encaixa no intervalo desejado.

Prefira conversões de tipo mais amplas, confirme se um valor cabe antes de reduzi-lo e converta um operando para ponto flutuante antes da divisão inteira. Habilite avisos do compilador para sinalizar conversões de risco.

Sim. Um assistente de IA escreve expressões de conversão a partir de um prompt, explica as regras de promoção e avisa quando uma conversão pode resultar em perda de dados. Sempre compile e teste o resultado.

Copiloto do GitHub sugere expressões de conversão implícitas e explícitas a partir de um comentário, incluindo a sintaxe (nome-do-tipo). RevAnalise cada sugestão quanto à possível perda de dados antes de compilar.

Resuma esta postagem com: