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

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

Palestras do TDC Business Disponíveis Online

🚨 Atenção, TDC Lovers! O TDC Business em São Paulo acabou, mas os conteúdos mal começaram!  Não pô de aproveitar a STADIUM ao vivo? Não tem problema, porque trouxemos ela até você. Todas as palestras da STADIUM, palco principal do TDC, já estão no ar e liberadas para qualquer pessoa assistir. Essa Trilha incrível conta com palestras de Trilhas Premium e temas variados de forma GRATUITA para você poder maratonar de casa!  Aproveite para prestigiar seu evento de TI favorito com pipoca direto do seu sofá. 🎥 🍿 Gravação da STADIUM, 22 a 24 de Agosto de 2022, disponível aqui: https://www.globalcode.com.br/videos/tdc-2022-business/  Todas as demais trilhas do TDC Business serão publicadas gradualmente nas próximas semanas, fique atento aos nossos e-mails, você será notificado por lá quando sua Trilha estiver disponível. Acompanhe nossas redes sociais para não perder nada e ficar por dentro de todas as novidades do TDC!

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 INNOVATION lança University Pass

Modalidade de ingresso tem como objetivo ajudar na capacitação dos universitários Uma pesquisa realizada em 2020 pela Associação Brasileira das Empresas de Tecnologia da Informação e Comunicação (Brasscom) diz que até o ano de 2024 o Brasil precisará de cerca de 420 mil profissionais na área de Tecnologia da Informação. Porém, por ano, a mesma pesquisa diz que o país forma apenas 46 mil profissionais capacitados no nicho. Pensando nisso, para ajudar na formação e capacitação desses jovens profissionais, o TDC INNOVATION, segunda edição do ano do The Developer's Conference, lança o University Pass, modalidade de ingresso que possibilita aceso digital gratuito a todas as palestras do evento, ou com 50% de desconto para quem preferir ir pessoalmente. Com o tema central “Desafios para a criação do futuro Digital”, o TDC INNOVATION ocorrerá entre 1 e 3 de junho, de forma híbrida: presencialmente no Centro de Convenções CentroSul, em Florianópolis, e com transmissão simultaneamente pela

Inspire a mudança com a liderança ágil

A liderança ágil é essencial para que uma organização realize mudanças de negócios significativas. Ser líder é uma tarefa desafiadora, especialmente em um cenário de constantes transformações, principalmente na forma de lidar com a relação empresa e pessoal. Pesquisas sobre liderança na era digital revelam que algumas soft skills têm sido substituídas por outras, o profundo conhecimento na área de negócio, ser referência nas tecnologias utilizadas, ter foco total no prazo e nas entregas e conhecer um arsenal de técnicas e ferramentas, têm dado espaço a habilidades, como: empatia; adaptabilidade; senso de equipe; visão e propósito; engajamento constante. A colaboração entre pessoas de todos os níveis hierárquicos são vitais, afinal, as equipes estão trabalhando para o mesmo objetivo: o encantamento e atendimento das necessidades do cliente que proporcionarão um crescimento sustentável da organização. Com propósito claro, estratégia e prioridades definidas, os times desfrutam de uma ma

Facelets ainda mais divertido! Parte II

De volta ao Facelets , na primeira parte mantive o foco na utilização de templates e técnicas de reutilização visando maior agilidade para desenvolver telas com JSF , mas o Facelets vai bem além disso! Nesse post vou comentar e mostrar um pouco sobre a criação de componentes UI (User Interface) usando xht ml - na minha opinião esse é o grande diferencial da tecnologia. Com esse recurso é possível customizar / padronizar componentes usando xhtml + tags JSF + JavaScript + Css, sem código Java. A ideia é bem próxima ao Tag File em uma rápida comparação com JSP (JavaServer Pages), mas no caso do Facelets feito de uma forma ainda mais simples e com aderência a (infra)estrutura do JSF. Vou descrever o mesmo cenário da primeira parte, um sistema composto por vários cadastros ( C reate R ead U pdate D elete). Pensando especificamente em cada formulário, usando como exemplo um rascunho ou protótipo para o cadastro de Fornecedores, podemos assumir o seguinte formato: campos para preenchi