Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Entender conversão implícita
  2. Entender a sinalização no casting
  3. Entender a perda de dados no casting
  4. Entender conversão explícita
  5. Uso de sizeof

A linguagem C nos permite realizar a conversão(casting) dos tipos de dados primitivos. Uma conversão em C pode ser do tipo implícita ou explícita. Nesta parte do tutorial vamos estudar o que foi dito neste parágrafo.

Na conversão implícita, sem perda de dados, um tipo de dado de um tamanho menor é convertido para um tipo de dado de tamanho maior. Nessa situação nenhum tipo de validação é feito, sendo a conversão feita de forma automática.

Exemplo 1
long int < int
int < short
short < char
Onde
<: Sentido da conversão. Menor tamanho para o de maior tamanho
Exemplo 2
#include <stdio.h>

int main()
{
    short int valor1 = 256; // 2bytes
    int valor2 = valor1; // 4 bytes < 2 bytes

    printf("valor1:%d\n",valor1);
    printf("valor2:%d",valor2);
}
Saída
valor1:256
valor2:256

Na conversão implícita, com perda de dados, um tipo de dado de tamanho maior é convertido para um tipo de dado de tamanho menor. Nesse caso, nenhum tipo de validação e a conversão é feita automaticamente. Apenas o tipo de dado de menor tamanho é convertido sendo o restante dos dados perdidos.

Exemplo 3
long int > int
int > short
short > char
Onde
>: Sentido da conversão. Maior tamanho para o de menor tamanho
Exemplo 4
#include <stdio.h>
int main()
{
    int valor1 = 65536;
    
    short valor2 = valor1;

    printf("valor1:%d\n",valor1);
    printf("valor2:%d",valor2);
    
}
Saída
valor1:65536
valor2:0

Para a conversão de números sinalizados de menor tamanho para sinalizados de maior tamanho, a sinalização é mantida. Por padrão, os tipos de dados numéricos são sinalizados. Os modificadores ser vistos em Modificadores de Sinalização.

Exemplo 5
#include <stdio.h>
int main ()
{
    char valor = 0xff; //char sinalizado
    printf("%d \n",valor);
    int valor2 = valor; // int sinalizado
    printf("%d \n",valor2);
    valor = valor2;
    printf("%d \n",valor);
}
Saída
-1 
-1 
-1 

Nas conversões discutidas acima, e de acordo com os tipos de dados estudados, temos como exemplo a relação das seguintes perdas de dados:

Tab 1: Perda de dados
Origem Tamanho(bytes) Origem Tamanho(bytes) Dados perdidos(bytes)
long int 8 int 4 4
int 4 short 2 2
short 2 char 1 1
long double 8 double 8 8
long float 8 float 4 4

A tabela acima é apenas para exemplificar a conversão com perda de dados. Baseado nos tipo de dados já estudados é possível relacionar a quantidade de dados perdidos.

Essa conversão explícita, o tipo de dados de destino é informado manualmente. A expressão é validada e convertida para o tipo de dado informado de destino. Nesse tipo de conversão, também há perda de dados como visto anteriormente.

Sintaxe
tipo_de_dado_destino nome_variavel = (tipo_de_dado_destino)expressao
Exemplo 5
#include <stdio.h>
int main()
{
    float valorFloat = 100.99;
    int inteiro = (int)valorFloat; //Valor obtido :100
    float decimal = valorFloat - inteiro; 

    printf("parte inteira:%d\n",inteiro);
    printf("parte decimal:%0.2f",decimal);
}
Saída
parte inteira:100
parte decimal:0.99

Os tópicos sobre perda de dados e sinalização mencionados anteriormente podem ser aplicados à conversão explícita dependendo dos tipos de dados envolvidos.

  1. 05/10/2024 - revisão 2 - Ajustes pontuais
  2. 27/09/2023 - revisão 1 - Correção em link/referências, tabela de perda de dados, erros gramaticais e outros
  3. 19/05/2023 - versão inicial