JavaRush /Blogue Java /Random-PT /Casting (conversão) de tipos primitivos em Java

Casting (conversão) de tipos primitivos em Java

Publicado no grupo Random-PT
Olá! Ao passar pelo JavaRush, você encontrou tipos primitivos mais de uma vez. Aqui está uma pequena lista do que sabemos sobre eles:
  1. Eles não são objetos e representam um valor armazenado na memória
  2. Existem vários tipos de tipos primitivos:
    • Números inteiros - byte, short, int,long
    • Números de ponto flutuante (fracionários) - floatedouble
    • Boleano -boolean
    • Simbólico (para indicar letras e números) -char
  3. Cada um deles tem sua própria faixa de valores:
Tipo primitivo Tamanho na memória Faixa de valores
byte 8 bits -128 a 127
curto 16 bits para -32768 a 32767
Caracteres 16 bits de 0 a 65536
interno 32 bits de -2147483648 a 2147483647
longo 64 bits de -9223372036854775808 a 9223372036854775807
flutuador 32 bits de (2 elevado a -149) a ((2-2 elevado a -23)*2 elevado a 127)
dobro 64 bits de (-2 elevado a 63) a ((2 elevado a 63) - 1)
boleano 8 (quando usado em arrays), 32 (quando usado em não arrays) verdadeiro ou falso
Mas, além dos valores, os tipos também diferem no tamanho da memória. intleva mais que byte. A long- mais que short. A quantidade de memória ocupada pelos primitivos pode ser comparada à das bonecas aninhadas: Expansão e contração de tipos primitivos - 2 há espaço livre dentro da boneca aninhada. Quanto maior a boneca, mais espaço. longPodemos facilmente colocar um menor dentro de uma boneca grande int. Cabe facilmente e você não precisa fazer nada extra. Em Java, ao trabalhar com primitivos, isso é chamado de conversão automática. De outra forma, é chamado de extensão. Aqui está um exemplo de extensão simples:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
Aqui atribuímos um valor bytea uma variável int. A atribuição foi realizada com sucesso e sem problemas: o valor armazenado em byteocupa menos espaço de memória do que “cabe” em int. “Pequena boneca” (valor byte) cabe facilmente na “grande matryoshka” (variável int). É outra questão quando você tenta fazer o oposto - colocar um valor grande em uma variável que não foi projetada para tais tamanhos. Em princípio, esse truque não funcionará com bonecos reais, mas em Java funcionará, mas com nuances. Vamos tentar colocar um valor intem uma variável short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Erro! O compilador entende que você está tentando fazer algo fora do padrão e coloca uma boneca matryoshka grande ( int) dentro de uma pequena ( short). Um erro de compilação neste caso é um aviso do compilador: “ Ei, tem certeza que deseja fazer isso? “Se você tiver certeza, informe o compilador: “ Está tudo bem, eu sei o que estou fazendo!” ”Esse processo é chamado de conversão explícita de tipo ou estreitamento . Para fazer um estreitamento, você precisa indicar explicitamente o tipo para o qual deseja converter seu valor. Em outras palavras, responda à pergunta do compilador: “ Bem, em qual desses bonequinhos você quer colocar esse boneco grande?” ”No nosso caso, será assim:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
Indicamos explicitamente que queremos ajustar o valor intem uma variável shorte assumir a responsabilidade por isso. O compilador, vendo uma indicação explícita de um tipo mais restrito, executa uma conversão. Qual será o resultado? Saída do console: -27008 Um pouco inesperado. Por que exatamente assim? Na verdade é simples. Tínhamos o valor original - 10000000 Ele foi armazenado em uma variável intque ocupava 32 bits, e na forma binária ficou assim: Expansão e contração de tipos primitivos - 3 Escrevemos esse valor na variável short, mas ela só pode armazenar 16 bits! Conseqüentemente, apenas os primeiros 16 bits do nosso número serão movidos para lá, o restante será descartado. Como resultado, a variável shortconterá o valor Expansão e contração de tipos primitivos – 4, que na forma decimal é exatamente igual a -27008. É por isso que o compilador “pediu confirmação” na forma de uma conversão explícita para um tipo específico. Em primeiro lugar, mostra que você assume a responsabilidade pelo resultado e, em segundo lugar, informa ao compilador quanto espaço deve ser alocado ao converter tipos. Afinal, se no último exemplo tivéssemos convertido intpara type byte, e não para short, teríamos apenas 8 bits à nossa disposição, e não 16, e o resultado teria sido diferente. Para tipos fracionários ( floate double), o estreitamento ocorre de maneira diferente. Se você tentar converter tal número para um tipo inteiro, sua parte fracionária será descartada.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Saída do console: 2

Tipo de dados char

Você já sabe que o tipo char é usado para exibir caracteres individuais.
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
Mas tem vários recursos que são importantes de entender. Vejamos novamente a tabela com intervalos de valores:
Tipo primitivo Tamanho na memória Faixa de valores
byte 8 bits -128 a 127
curto 16 bits -32768 a 32767
Caracteres 16 bits de 0 a 65536
interno 32 bits de -2147483648 a 2147483647
longo 64 bits de -9223372036854775808 a 9223372036854775807
flutuador 32 bits de (2 elevado a -149) a ((2-2 elevado a -23)*2 elevado a 127)
dobro 64 bits de (-2 elevado à potência de 63) a ((2 elevado à potência de 63) -1)
boleano 8 (quando usado em arrays), 32 (quando usado em não arrays) verdadeiro ou falso
O tipo charpossui um intervalo numérico de 0 a 65536. Mas o que isso significa? Afinal, charnão se trata apenas de números, mas também de letras, sinais de pontuação... O fato é que os valores charsão armazenados em Java no formato Unicode. Já encontramos o Unicode em uma das palestras anteriores. Você provavelmente se lembra que Unicode é um padrão de codificação de caracteres que inclui caracteres de quase todos os idiomas escritos do mundo. Em outras palavras, esta é uma lista de códigos especiais em que existe um código para quase todos os caracteres de qualquer idioma. A tabela Unicode geral é muito grande e, claro, não precisa ser memorizada. Aqui, por exemplo, está um trecho: Expansão e contração de tipos primitivos – 5 O principal é entender o princípio de armazenamento de valores char, e lembrar que conhecendo o código de um símbolo específico, você sempre pode obtê-lo no programa. Vamos tentar isso com algum número aleatório:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Saída do console: Este é o formato no qual os caracteres são armazenados em Java char. Cada caractere corresponde a um número – um código numérico de 16 bits ou dois bytes. Unicode 32816 corresponde ao caractere 耰. Preste atenção neste momento. Neste exemplo usamos a variável int. Ocupa 32 bits de memória , enquanto char16 . Aqui escolhemos porque o número que precisamos, 32816, está fora do intervalo . Embora o tamanho , assim como o curto, seja de 16 bits, não há números negativos no intervalo, portanto o intervalo “positivo” é duas vezes maior (65536 em vez de 32767 ). Podemos usar , desde que nosso código esteja dentro do intervalo 65536. Mas se criarmos um número , ele ocupará mais de 16 bits. E ao restringir os tipos: intshortcharcharcharshortintint >65536
char c = (char) x;
os bits extras serão descartados e o resultado será bastante inesperado.

Recursos de adição de caracteres e inteiros

Vejamos este exemplo incomum:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Saída do console: 50 O_O Onde está a lógica? 1+1, de onde veio 50?! Você já sabe que os valores charsão armazenados na memória como números no intervalo de 0 a 65536, representando o Unicode do nosso personagem. Expansão e contração de tipos primitivos – 6 Então aqui está. Quando realizamos adição chare algum tipo inteiro charé convertido no número que lhe corresponde em Unicode. Quando em nosso código adicionamos 1 e '1', o símbolo '1' foi transformado em seu código, que é 49 (você pode conferir na tabela acima). Portanto, o resultado passou a ser igual a 50. Vamos mais uma vez pegar nosso velho amigo -como exemplo e tentar adicioná-lo com algum número.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
Saída do console: 33016 Já descobrimos quecorresponde ao código 32816. E quando somamos este número e 200, obtemos exatamente o nosso resultado - 33016 :) O mecanismo de funcionamento, como você pode ver, é bastante simples.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION