Depois de falar sobre a conversão entre as bases binária e decimal na primeira parte deste artigo e sobre a representação de inteiros em Java na segunda parte, finalmente, trataremos da conversão (cast) de tipos primitivos, e conseguiremos entender efetivamente Por que (byte) 157 = -99?
Conversão de tipos primitivos inteiros
Para responder a pergunta do título, vamos precisar saber o número de bits/bytes utilizados para representar cada um dos tipos primitivos inteiros na Plataforma Java.
Então vamos observar a mensagem que se obtém ao tentar compilar o seguinte código:
A referida perda de precisão acontece devido aos 8 bits do tipo
Como calculado na primeira parte do artigo a representação de 157 na base decimal é equivalente a
Desprezando os primeiros 24 bits
Para realizar a conversão precisamos inicialmente verificar o bit de sinal, primeiro bit, e:
Exercite a conversão, realize o cálculo do cast de 190 para byte e use o código apresentado abaixo para verificar.
Até mais!
Marcelo de Castro
http://twitter.com/mcastroinfo
http://www.globalcode.com.br/instrutores/MarceloCastro
Conversão de tipos primitivos inteiros
Para responder a pergunta do título, vamos precisar saber o número de bits/bytes utilizados para representar cada um dos tipos primitivos inteiros na Plataforma Java.
O tipo byte ocupa 1 byte ou 8 bits
O tipo short ocupa 2 bytes ou 16 bits
O tipo int ocupa 4 bytes ou 32 bits
O tipo long ocupa 8 bytes ou 64 bits
Então vamos observar a mensagem que se obtém ao tentar compilar o seguinte código:
public class TesteConversao {A mensagem apresentada é:
public static void main(String[] args) {
int inteiro = 157;
byte b = inteiro;
}
}
TesteConversao.java:4: possible loss of precision
found : int
required: byte
byte b = inteiro;
^
1 error
A referida perda de precisão acontece devido aos 8 bits do tipo
byte
não comportarem os 32 bits do tipo int
. Esta atribuição pode ser realizada, com perda dos primeiros 24 bits, mediante a realização de cast explícito, conforme código abaixo:
public class TesteConversao {
public static void main(String[] args) {
int inteiro = 157;
byte b = (byte) inteiro; // cast explícito
}
}
Como calculado na primeira parte do artigo a representação de 157 na base decimal é equivalente a
1001 1101
em binário, e como visto na segunda parte para obter a representação deste valor no tipo int
(4 bytes) basta preencher os bits a esquerda com zero, resultando em
0
000 0000 0000 0000 0000 0000 1001 1101
agora vamos realizar o cast deste valor para byte desprezando os primeiros 24 bits, e realizar a conversão do valor resultante para a base decimal.0 000 0000 0000 0000 0000 0000 1001 1101
Desprezando os primeiros 24 bits
1001 1101
Para realizar a conversão precisamos inicialmente verificar o bit de sinal, primeiro bit, e:
- sendo 0 (zero), o número é positivo, e basta realizar conversão dos bits de valor para a base decimal, conforme apresentado na primeira parte deste artigo
- sendo 1 (um), o número é negativo, e precisamos subtrair 1 (um) dos bits de valor, inverter os bits resultantes, calcular o número correspondente na base decimal, e lembrar que o mesmo é negativo.
Dado que em 1001 1101 o bit de sinal é negativo,
Como dito anteriormente, devemos realizar as seguintes etapas:
Subtrair 1 (um) dos bits de valor:
001 1101 – 1 = 001 1100
Inverter os bits resultantes:
~(001 1100) = 110 0011
Converter para base decimal:
1 x 26 = 64
1 x 25 = 32
0 x 24 = 0
0 x 23 = 0
0 x 22 = 0
1 x 21 = 2
1 x 20 =1
64 + 32 + 0 + 0 + 0 + 2 + 1 = 99
Lembrar que o mesmo é negativo:
-99
Exercite a conversão, realize o cálculo do cast de 190 para byte e use o código apresentado abaixo para verificar.
public class TesteConversao {Espero que esta sequência de posts tenha sido esclarecedora e possa ter contribuído para o entendimento da Plataforma Java.
public static void main(String[] args) {
System.out.println((byte)190);
}
}
Até mais!
Marcelo de Castro
http://twitter.com/mcastroinfo
http://www.globalcode.com.br/instrutores/MarceloCastro
Comentários