Por que o cast é necessário?

Casting é um recurso que converte um determinado valor/variável para outro tipo daquele original. Neste post eu trago uma explicação do porque da necessidade de fazer o cast, com foco na linguagem de programação C/C++.

Uma questão que você pode ter se perguntado é do porque da necessidade de fazer um cast que transforma 2 em 2.0, ou vice e versa, se o número é, no final das contas, o mesmo. Para isso é importante recordar que os valores são armazenados no computador na forma binária e apenas com dígitos zeros e uns.

Embora na matemática exista a representação binária de um valor float, o computador não funciona dessa maneira. Para ilustrar, considere o valor 25,5. Uma representação binária desse valor é a sequência 11001,1. Essa notação faz uso do separador de casas decimais, o que não existe na representação computacional.

Outra representação binária de valores float é proposta pela norma IEEE 754, desenvolvida pelo Instituto de Engenheiros Eletricistas e Eletrônicos, e utilizado como principal padrão para operações e representatividade de números binários com ponto flutuante (float).

A norma IEEE 754 define dois formatos básicos para os números em ponto flutuante: o formato simples, com 32 bits e o formato duplo, com 64 bits. O formato simples é o utilizado no tipo float, enquanto o formato duplo é utilizado no tipo double. A sequência de bits do valor é utilizada para armazenar o sinal, o expoente e a mantissa do número.

Em ambos os formatos o primeiro bit é utilizado para determinar o sinal, cujo valor 0 representa número positivo e o 1 representa número negativo. No formato simples o expoente tem 8 bits e a mantissa tem 23 bits. No formato duplo, o expoente tem 11 bits e a mantissa 52 bits.

O objetivo dessa seção não é explicar como é obtido os valores convertidos no padrão IEEE 754, mas ilustrar a questão da representatividade binária. O numero decimal 25,5, convertido para o padrão IEEE 754 simples resulta na sequência binária 01000001110011000000000000000000. Essa mesma sequência binária, mas utilizada para representar um número inteiro, resulta na sequência binária 1103888384 (utilizando o ponto como separador de milhar para melhor visualização tem-se 1.103.888.384). Observe que a mesma sequência binária resulta em valores bastante distintos se ela for interpretada para um valor float ou para um valor int.

Para outra ilustração em relação aos tipos de dados, considere uma variável int permite armazenar valores entre -2.147.483.648 e 2.147.483.647. Se a variável permitir apenas o uso de valores positivos, a variável pode ser definida como unsigned int (inteira sem sinal) que consegue armazenar valores entre 0 a 4.294.967.295. Ambos são armazenadas em 4 bytes, mas a sequência binária que representa o menor valor int resulta o número -2.147.483.648, enquanto se a sequência representar um valor unsigned int o resultado é o número zero.

Para mais sobre o casting, recomendo a leitura de: Diferença entre arredondamento por função e por cast

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.