Pular para o conteúdo principal

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

Conforme dito na primeira parte deste artigo, que mostra a Conversão entre as bases binária e decimal, para entender a razão pela qual a conversão 157 para o tipo byte resulta em -99 (noventa e nove negativo), nesta segunda parte vamos tratar a representação binária de inteiros na Plataforma Java.

Representação de inteiros em Java

Em Java, não existem tipos inteiros sem sinal (unsigned) e é utilizado o complemento de dois para representar os inteiros, onde o primeiro bit (mais significativo) é utilizado para representar o sinal, sendo 0 (zero) para positivo e 1 (um) para negativo.

Para obter a representação binária dos números inteiros positivos basta pegar o valor binário 1001 1101 (no caso, 157 em decimal) e preencher os bits a esquerda com zero de acordo com o tipo da variável.

Em um post anterior sobre os Literais da Linguagem Java foi esclarecido que um literal inteiro, no caso 157, é do tipo int, então vamos preencher com zeros, inclusive o bit de sinal, conforme segue:

tipo int ocupa 4 bytes,
mais detalhes na terceira parte do artigo,
então 157 é representado como:
0 000 0000 0000 0000 0000 0000 1001 1101

Já para calcular como são representados os números inteiros negativos, realizamos o seguinte processo: cálculo da representação do número positivo em binário, inversão dos bits e a soma de um ao resultado da inversão, então:

Então para calcular a representação de -157 (cento e cinqüenta e sete negativo), devemos:

Calcular a representação de 157 (cento e cinqüenta e sete positivo) em binários:
(cálculo realizado no post anterior)
0 000 0000 0000 0000 0000 0000 1001 1101
Inverter os bits:
1 111 1111 1111 1111 1111 1111 0110 0010
Somar 1 (um) ao resultado da inversão:
1 111 1111 1111 1111 1111 1111 0110 0010 + 1 =
1 111 1111 1111 1111 1111 1111 0110 0011
E chega-se ao resultado do cálculo do complemento de dois, para -157, que é:
1 111 1111 1111 1111 1111 1111 0110 0011

Para testar se a conversão foi realizada corretamente pode ser utilizado o seguinte código:

System.out.println(Integer.toBinaryString(157));
System.out.println(Integer.toBinaryString(-157));
Exercite a conversão, realize o cálculo do complemento de dois para outros valores inteiros negativos e teste com o código apresentado acima.

Em breve postarei a terceira e última parte do artigo, na qual, trataremos da conversão (cast) de tipos primitivos, e conseguiremos entender efetivamente “Por que (byte) 157 = -99?”.

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

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...

Alguma certificação Java nos seus planos em 2010 ?

A discussão sobre certificações é super polêmica, alguns acham muito importante, outros acham totalmente insignificante. Eu particularmente acho que é uma meta de aprendizado, que nos força a aprender bem detalhadamente uma tecnologia. É claro que é "burlável" quero dizer, todo mundo conhece alguém que é certificado e "não sabe nada". Mas, evidentemente quando você se prepara, estuda, vai aprender muitas coisas novas e solidificar ainda mais seu conhecimento. Eu sempre fui muito "orientada" por deadlines... estas metas nos obrigam a encaixar algumas horas de estudo nesta vida tão corrida. E o inicio do ano é muito bom para estas iniciativas, porque estamos um pouco mais descansados, com aquele espírito de inicio de ano. Imagine chegar em março e já ter cumprido uma das metas de final de ano, e estar com a certificação "tirada" ? Não acho que precisa ser um caçador de certificações, e tentar tirar todas as certificações possíveis, mas acho ...

Facelets uma forma mais ágil para construção de telas – Parte I

A construção de telas ou camada de apresentação em um sistema MVC seja web ou desktop é uma tarefa complexa e de extrema importância. Nesse post vou comentar e mostrar algum exemplo do Facelets como solução para os desafios existentes nessa etapa especificamente para web. Com a web cada vez mais presente em nosso dia-a-dia, um fato é que com isso nossos usuários tornam-se mais exigentes em relação a usabilidade, agilidade, performance ou de uma forma bem resumida “o usuário espera uma navegação simples e agradável aonde uma determinado tarefa possa ser concluída em poucos passos e em um curto espaço de tempo”. Atender as expectativas em relação ao que o usuário espera com o que realmente ele precisa, definir uma estrutura flexível a mudanças sem engessar o desenvolvimento, acessibilidade, portabilidade em múltiplos navegadores, tudo isso e muito mais, num prazo que quase sempre é apertado. Um outro ponto fundamental é manter o time motivado e produtivo em um ambiente que favoreça a...

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...

JavaMail: Enviando mensagem HTML com anexos

Introdução Depois do post "JavaMail: Enviando e-mail com Java" , que apresentava como enviar um e-mail com Java, resolvi complementar a assunto apresentando como enviar uma mensagem formatada, em HTML , e também como realizar o envio de anexos. Bibliotecas Além da biblioteca JavaMail, veja mais no post anterior , é necessário incluir o JavaBeans Activation Framework (JAF), apenas se a versão utilizada for anterior ao JSE 6.0 , que já tem o JAF incluso. O JAF está disponível em http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html , e neste download encontramos, alguns exemplos na pasta demo , documentação, incluindo javadocs, na pasta docs e a biblioteca activation.jar , que deve ser acrescentada no classpath da aplicação para versões anteriores ao JSE 6.0. Exemplo Primeiramente devemos realizar a configuração da javax.mail.Session e da javax.mail.internet.MimeMessage , estes passos podem ser vistos no post anterior . Agora vamos montar um...