Pular para o conteúdo principal

Por que (byte) 157 = -99? Parte 3 de 3

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.

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 {
public static void main(String[] args) {
int inteiro = 157;
byte b = inteiro;
}
}
A mensagem apresentada é:

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.
Dito isto, vamos converter 1001 1101 para a base 10

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 {
public static void main(String[] args) {
System.out.println((byte)190);
}
}
Espero que esta sequência de posts tenha sido esclarecedora e possa ter contribuído para o entendimento da Plataforma Java.

Até mais!
Marcelo de Castro
http://twitter.com/mcastroinfo
http://www.globalcode.com.br/instrutores/MarceloCastro

Comentários

Postagens mais visitadas deste blog

O que é Lógica de programação?

Este é o segundo de uma série de posts voltados aos leitores do blog que estão dando início à carreira de desenvolvimento de software. O assunto de hoje é a lógica de programação. Para ler antes: Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados A lógica de programação é um pré-requisito para quem quer se tornar um desenvolvedor de software, independente da linguagem de programação que se pretende utilizar. Mas o que é de fato a Lógica de Programação e como saber se eu tenho esse pré-requisito? A lógica de programação nada mais é do que a organização coerente das instruções do programa para que seu objetivo seja alcançado. Para criar essa organização, instruções simples do programa, como mudar o valor de uma variável ou desenhar uma imagem na tela do computador, são interconectadas a estruturas lógicas que guiam o fluxo da execução do programa. Isso é muito próximo ao que usamos em nosso cotidiano para realizar atividad...

TDC ONLINE: SUA PLATAFORMA DE PALESTRAS GRAVADAS DO TDC DISPONÍVEL

Além do conteúdo ao vivo transmitido online nas edições do TDC, agora você pode ter acesso à centenas de palestras gravadas, através da nossa nova plataforma de vídeos - o TDC Online, que reúne todas as Trilhas premium, Stadium e Salas dos Patrocinadores das edições anteriores de 2022, TDC Innovation e TDC Connections.  Para acessar, basta clicar na edição em que você participou ( TDC Innovation ou TDC Connections ); Fazer o mesmo login (com e-mail e senha) cadastrados na hora de adquirir ou resgatar o seu ingresso no TDC; E clicar na Trilha de sua opção, e de acordo com a modalidade do seu ingresso. Logo em seguida, você será direcionado para a seguinte página com a lista de todas as palestras por Trilha: Pronto! Agora você tem acesso à centenas de palestras gravadas da sua área de interesse, para assistir como e quando quiser! Caso tenha esquecido a senha, clique na opção "Esqueci a senha" , insira o e-mail que você realizou para o cadastro no evento, e aparecerá a op...

TDC BUSINESS, chega a São Paulo com novas trilhas de Inteligência Artificial e Inovação

Maior conferência de profissionais de tecnologia do Brasil abordará temas em alta no momento como, por exemplo, Inteligência Artificial, Segurança, Ciência de Dados e Inovação O TDC BUSINESS, a 17° edição do The Developer's Conference na cidade de São Paulo, que acontece entre os dias 19 e 21 de Setembro, reunirá profissionais e especialistas da área para troca de experiência, compartilhamento de conteúdos e networking. Com o tema central: “Tecnologia para negócios transformadores”, o evento será totalmente híbrido, ocorrendo presencialmente no espaço Pro Magno, e com transmissão simultânea e atividades de network pela internet. A expectativa é reunir mais de 14.000 pessoas, somando a participação presencial e online.   Segundo Yara Mascarenhas, Fundadora e Host do Evento, “nosso objetivo com o TDC é inspirar a colaboração entre os profissionais e empresas para construir uma nova realidade para o mercado de TI.  Vamos juntar tecnologia e negócios com as trilhas técnicas...

12 ESQUENTAS TDC ESPERANDO POR VOCÊ

O TDC nasceu do sonho de profissionais que valorizam o compartilhamento de conhecimento, experiências e oportunidades entre as comunidades de desenvolvedores.  Por isso, o crescimento do TDC nunca poderia ficar longe do crescimento das comunidades! Pensando nessa união, criamos um projeto quente: O ESQUENTA TDC ! Visando divulgar os meetups de comunidades que querem transformar e inspirar carreiras, foi co-criado este projeto lindo e cheio de apoio, onde o TDC abraça meetups de diversas comunidades espalhadas pelo Brasil e elas contribuem com a divulgação da edição regente.  O TDC Innovation vai rolar de 14 a 16 de JUNHO, mas até lá vão acontecer muitos encontros incríveis!  Fique por dentro das comunidades que vão participar, quais temas irão abordar e claro as datas e locais para você participar. 💥Esquentas TDC Innovation 2023: 24/05 - Esquenta TDC: Carreira e Desenvolvimento Presencial em Floripa das 19:00 as 21:30 com inscrição AQUI Comunidade: Google Developer...

JSON fácil em Java com GSon !

Ola pessoal ! O formato JSON ( J ava S cript O bject N otation) vem se consagrando cada vez mais na comunicação de dados, principalmente nos dispositivos móveis devido a esse formato ser mais leve que o XML e também mais legível. Uma prova disso são as inúmeras bibliotecas que existem para manipular esse formato, e no caso do Android, o suporte ao JSON é nativo. Mas apesar de ter esse suporte nativo, algumas operações devem ser feitas manualmente e o código acaba ficando um pouco verboso e repetitivo, já que para cada objeto que se deseja transmitir é necessário fazer um método que lê as propriedades do JSON e faz as devidas atribuições no seu objeto Java. Vamos supor o seguinte objeto sendo transmitido em JSON: {   user: {     id: 123456,     name: "Neto Marin",     username: "netomarin",     email: "netomarin@globalcode.com.br"   } } Se você fosse tratar um Webservice que envia esse JSON para o seu aplicativo Android...

JavaOne Brasil, dicas para submissão de palestras

Não quero parecer pretensiosa dando dicas para submissão de palestras para o JavaOne Brasil, mas sim repassar os tantos conselhos e sugestões recebidas pelos vetaranos do JavaOne: Bruno Souza e Leonardo Galvão que revisaram dezenas de submissões para o JavaOne e ajudaram a aprovar tantas palestras, e também misturar um pouco da minha experiência na seleção de palestras nos eventos realizados pela Globalcode e SouJava . 10 anos de JavaOne: http://www.globalcode.com.br/noticias/Globalcode10AnosNoJavaOne Os palestrantes ganham a entrada! A submissão pode ser feita em português! O passo mais importante para ser aprovado como palestrante no JavaOne é sem dúvida nenhuma submeter pelo menos uma palestra. Então, independente de qualquer coisa, participe, arrisque, divulgue.  Mas, se quiser aumentar as suas chances...   1) Leve a sério: peça para amigos fazerem uma leitura crítica do texto, e claro uma boa revisão ortográfica. 2) Submissão de várias palestras ou variações do ...