DEV Community

Conversão de tipos

Conversão de tipos em atribuições

  • É comum atribuir um tipo de variável a outro em programação.

Exemplo: atribuir um valor int a uma variável float.
Image description

  • Quando tipos compatíveis são combinados em uma atribuição, o valor do lado direito é automaticamente convertido para o tipo do lado esquerdo. No exemplo, o valor de i é convertido para float e então atribuído a f.

  • Nem todos os tipos são compatíveis devido à rigorosa verificação de tipos de Java (ex: boolean e int não são compatíveis).

  • Uma conversão automática ocorre quando:
    Os dois tipos são compatíveis.
    O tipo de destino é maior que o de origem.

  • Quando essas condições são atendidas, ocorre uma conversão ampliadora.
    Exemplo: int pode conter todos os valores válidos de byte, permitindo uma conversão automática de byte para int.

  • Tipos numéricos, incluindo inteiros e de ponto flutuante, são compatíveis em conversões ampliadoras.
    Exemplo válido: a transformação de long em double é uma conversão ampliadora executada automaticamente.

Image description

Existe a conversão automática de long para double, não há conversão automática de double para long, já que essa não é uma conversão ampliadora.

Image description

  • Não há conversões automáticas de tipos numéricos para char ou boolean.

Convertendo tipos incompatíveis

  • Conversões automáticas de tipos são úteis, mas não cobrem todas as necessidades de programação, aplicando-se apenas a conversões ampliadoras entre tipos compatíveis.

  • Para outros casos, é necessário utilizar uma coerção (cast).

  • Coerção é uma instrução que solicita explicitamente a conversão de um tipo para outro.

  • Forma geral de uma coerção:
    (tipo-destino) expressão.

Exemplo:
(int) (x / y)
converte o resultado da expressão x / y para int.

  • Os parênteses em torno de x / y são necessários para garantir que a coerção seja aplicada ao resultado da divisão e não apenas a x.

  • Coerção (cast) é necessária quando não há conversão automática entre os tipos, como de double para int.

  • Coerção envolvendo uma conversão redutora pode resultar na perda de informações.

  • Por exemplo, ao converter um long para um short, informações serão perdidas se o valor do tipo long for maior do que o intervalo do tipo short, pois os bits de ordem superior serão removidos.

  • Quando um valor de ponto flutuante é convertido para um tipo inteiro, o componente fracionário é perdido devido ao truncamento.

Exemplo:
ao atribuir o valor 1.23 a um inteiro, o valor resultante será apenas 1, com a perda do 0.23.

Image description

Saída:
Integer outcome of x / y: 3
Value of b: 100
Value of b: 1
ch: X

  • A coerção de (x / y) para int resulta no truncamento do componente fracionário, perdendo informações.

  • Não há perda de informação quando b recebe o valor 100, pois um byte pode conter esse valor.

  • Ao tentar atribuir o valor 257 a b, ocorre perda de informações porque 257 excede o valor máximo de um byte.

  • Nenhuma informação é perdida, mas uma coerção é necessária na atribuição de um valor byte a um char.

Top comments (0)