No último texto, expliquei as bases numéricas e seus sistemas.

Neste texto o assunto é como converter os números de uma base para outra.

Antes de começar, um aviso: não comecem este curso em qualquer lugar, comecem do começo. Quem já sabe vai rever, quem não sabe vai aprender e a linearidade de raciocínio para este conteúdo é uma exigência. Para isto elaborei um índice do curso que pode ser encontrado neste link.

É pré-requisito para entender este conteúdo, conhecer as bases numéricas explicadas na última aula e ter feito os exercícios do final do texto. Tudo que eu peço é um aproveitamento mínimo de 100% e este é o espírito que mantenho aqui:

Prefiro entender uma causa do que ser o rei da Pérsia.

Demócrito (filósofo pré-socrático e pai da química)

Entendemos no texto anterior o que são as bases numéricas, o que são sistemas numéricos, as bases numéricas decimal, binária e hexadecimal e por quais motivos surgiu cada uma no meio da computação. É deste ponto que partiremos. No vídeo que acompanha este texto farei uma rápida revisão para recapitular e manter o raciocínio linear.

De posse da informação das origens, do funcionamento interno e de suas relações, chegou a hora lidarmos com elas. A princípio faremos isto manualmente, pois o mais importante é realmente entender o funcionamento, após absorvido o conhecimento, o automatizamos com a tecnologia. Entender completamente antes de automatizar é importante pois os conceitos precedem as realizações e nosso intuito declarado aqui, é que ao final do curso sejamos capazes de criar máquinas de verdade. Não pegaremos atalho, percorreremos a longa trajetória com disposição.

Converter de qualquer base numérica para a decimal

Atenção iniciantes:

Antes de iniciarmos esta viagem pelas operações, é necessário deixar algumas observações para aqueles que agora tem seu primeiro contato com este mundo.

Em computação, os sinais para as operações matemáticas são os seguintes.

operações matemáticas

Como se compõe um número, matematicamente, mesmo na base numérica decimal? Para responder esta questão temos que atentar para os limites da base.

A base numérica decimal inicia-se no número 0 (zero) e vai até o número 9 (nove): 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.

Quando este limite esgota-se, numa soma consecutiva de 1, nós zeramos a base e aumentamos 1 na casa da esquerda.

0 + 1 = 1
1 + 1 = 2

8 + 1 = 9
9 + 1 = 10

O número 10 (dez) interpretado como deve ser significa: 1 (uma) dezena e 0 (zero) unidades.

unidades e dezenas

16 = 1 dezena e 6 unidades.

Qualquer número entre 10 e 19, segue este raciocínio, examinemos o 16 por exemplo:

Quando pronunciamos o 16, estamos dizendo na verdade: já contei até dez uma vez, agora no 6 novamente.

Matematicamente isso se expressa na seguinte fórmula:

16 = (1 * 10) + 6

A cada 10 números somados, as casas decimais alteram-se, por exemplo, se somarmos ao 16, mais 10, o 6 permanece e o 1 vira 2. Observe a sequência abaixo:

  • O que significa o 16?

16 = (1 * 10) + 6

  • E se somarmos 10?

16 + 10 = 26

  • E o que significa o 26?

26 = (2 * 10) + 6

Em outras palavras, o cálculo se dá considerando a base numérica e a posição do número. Se o número fosse 237, por exemplo, seria desta forma:

237 = (2 * 100) + (3 * 10) + 7

Seriam 2 centenas, mais 3 dezenas, mais 7 unidades, somadas.

Observe que a cada nova casa decimal que se adiciona à esquerda, maior o número fica. Isto pode parecer óbvio e desnecessário, mas acontece que em computação lidamos com diversas bases numéricas e o mundo do decimal vai se tornar apenas um dos mundos que lidamos, portanto a formação de seus números será importante para transitarmos entre binário, hexadecimal e o próprio decimal.

No sistema decimal, as casas decimais são formadas a partir de múltiplos de 10. Observem:

10 * 10 = 100
10 * 10 * 10 = 1000
10 * 10 * 10 * 10 = 10000

Assim sucessivamente. Para representar uma multiplicação de um número por ele mesmo, em matemática usamos a exponenciação. A expressão acima fica da seguinte forma:

10 ^ 2 = 100
10 ^ 3 = 1000
10 ^ 4 = 10000

  • Observação: o sinal equivalente à potência em computação é o “^“. A operação: “10 ^ 2“, significa: “10 elevado à 2ª potência“.

Ou seja, as casas decimais são potências de 10, pois a base é o sistema numérico decimal (se fosse outro sistema seria outra base, já chegaremos lá).

Dito isto, agora temos uma nova fórmula para decompor os números decimais:

Número * ( base numérica ^ posição )

Fazemos isso decompondo os números, para entender como se formam a cada nova casa decimal adicionada, exemplos:

16 = 1 * (10 ^ 1) + 6 * (10 ^ 0)
16 = 1 * 10 + 6 * 1
16 = 10 + 6

Observe a aplicação da fórmula:

aplicação da fórmula

Com relação a posição dita na fórmula, a contagem é feita da direita para a esquerda, ou seja, começando pelas unidades e como se trata de um índice e não de uma quantidade, o primeiro número é o 0 (zero) e não o 1 (um), portanto, se o número fosse 6723 as posições seriam as descritas a seguir:

número e posição na fórmula

Prossigamos aplicando o mesmo critério em outros exemplos:

857 = 8 * (10 ^ 2) + 5 * (10 ^ 1) + 7 * (10 ^ 0)
857 = 8 * 100 + 5 * 10 + 7 * 1
857 = 800 + 50 + 7

5432 = 5 * (10 ^ 3) + 4 * (10 ^ 2) + 3 * (10 ^ 1) + 2 * (10 ^ 0)
5432 = 5 * 1000 + 4 * 100 + 3 * 10 + 2 * 1
5432 = 5000 + 400 + 30 + 2

  • Observação: em operações de potenciação, todo número elevado à 1 resulta nele mesmo.
  • Observação 2: em operações de potenciação, todo número elevado à 0 resulta em 1.

Agora que sabemos compor e decompor números da base numérica decimal, vamos aplicar as mesmas regras à outra base: a binária.

Sabendo também que a base binária possui apenas 2 números, como converter o número 1111 para decimal? Aplicando a mesma fórmula: Número * ( base numérica ^ posição ).

Para o binário, a base numérica é 2, acompanhem:

1111 = 1 * (2 ^ 3) + 1 * (2 ^ 2) + 1 * (2 ^ 1) + 1 * (2 ^ 0)
1111 = 1 * (2 * 2 * 2) + 1 * (2 * 2) + 1 * (2) + 1 * (1)
1111 = 1 * 8 + 1 * 4 + 1 * 2 + 1 * 1
1111 = 8 + 4 + 2 + 1
1111 = 15

O número binário 1111 equivale portanto ao 15 decimal.

E se o número fosse 1001? Basta aplicar a mesma fórmula: Número * ( base numérica ^ posição )

1001 = 1 * (2 ^ 3) + 0 * (2 ^ 2) + 0 * (2 ^ 1) + 1 * (2 ^ 0)
1001 = 1 * (2 * 2 * 2) + 0 * (2 * 2) + 0 * (2) + 1 * (1)
1001 = 1 * 8 + 0 * 4 + 0 * 2 + 1 * 1
1001 = 8 + 0 + 0 + 1
1001 = 9

O número binário 1001 equivale portanto ao decimal 9.

Acredito que com isso podemos avançar.

A base numérica hexadecimal trabalha com 16 símbolos para representar em um único caractere as quantidades de 0 (zero) a 15:

Isto não é novidade, obrigatoriamente, pois tratamos no texto anterior. Agora vejamos como converter um número escrito em hexadecimal para a base decimal. Supondo o número hexadecimal 3AD, aplicando a fórmula: Número * ( base numérica ^ posição ).

Lembrando que para o hexadecimal, a base numérica é 16, atentem:

3AD = 3 * (16 ^ 2) + A * (16 ^ 1) + D * (16 ^ 0)

Neste caso, antes de prosseguirmos, precisamos traduzir os símbolos hexadecimais para os números correspondentes decimais antes de continuar. Observem:

3AD = 3 * (16 ^ 2) + A * (16 ^ 1) + D * (16 ^ 0)
3AD = 3 * (16 ^ 2) + 10 * (16 ^ 1) + 13 * (16 ^ 0)

Ficou claro? Após esta tradução de símbolos, basta continuarmos a equação até o final:

3AD = 3 * (16 ^ 2) + A * (16 ^ 1) + D * (16 ^ 0)
3AD = 3 * (16 ^ 2) + 10 * (16 ^ 1) + 13 * (16 ^ 0)  ->  (tradução de símbolos)
3AD = 3 * (16 * 16) + 10 * (16) + 13 * (1)
3AD = 3 * 256 + 10 * 16 + 13 * 1
3AD = 768 + 160 + 13
3AD = 941

O hexadecimal 3AD corresponde ao decimal 941.

De posse da fórmula Número * ( base numérica ^ posição ), tudo fica fácil, extremamente fácil, pra você, e eu, e todo mundo cantar junto. 🙂

Com as instruções e exemplos acima, somos capazes de converter qualquer número binário, hexadecimal ou ainda de outras bases numéricas existentes por aí, como a octal por exemplo, que não abordei (e nem vou abordar), para decimal.

Vamos agora fazer o caminho inverso.

Converter de decimal para qualquer base numérica

O caminho para converter das bases numéricas binária e hexadecimal para a decimal foi a multiplicação. Realizar a conversão inversa é fazer portanto, a operação inversa e no caso da multiplicação, tal operação inversa é a divisão.

Basta dividirmos sucessivamente o número decimal pela base numérica guardando o resto da divisão e prosseguindo com os quocientes até que não restem mais divisões possíveis.

Número / base numérica (guardar o resto)

Supondo o número decimal 25, vamos convertê-lo para a base binária:

25 / 2 = quociente: 12 | resto: 1
12 / 2 = quociente: 6 | resto: 0
6 / 2 = quociente: 3 | resto: 0
3 / 2 = quociente: 1 | resto: 1

Então, realizada as divisões, coletamos o último quociente e os restos das divisões da última para a primeira, formando uma sequência:

Último quociente: 1

Restos de divisões, do último para o primeiro em sequência: 1 0 0 1

Sequência final: 1 1 0 0 1

O decimal 25 corresponde ao binário 11001.

É ainda mais fácil que a conversão anterior.

Vamos agora converter um número decimal para hexadecimal, usando o mesmo esquema. Suponha o número 490.

490 / 16 = quociente: 30 | resto: 10
30 / 16 = quociente: 1 | resto: 14

Basta repetir a operação passada: coletar o último quociente e o os restos das divisões, da última para a primeira.

Último quociente: 1

Restos das divisões: 14 10

Sequência: 1 14 10

Como a base é hexadecimal, traduzimos os números maiores que nove, que ainda estão em decimal para os correspondentes da base hexadecimal.

Sequência: 1 14 10 = 1 E A

O decimal 490 corresponde portanto ao hexadecimal 1EA.

Não há dificuldade real nisto, apenas aplicar um pouco de matemática.

Conversões desnecessárias

Neste amplo universo da computação, felizmente existem apenas 2 espécies de personagens que realmente importam: o homem e a máquina. O homem entende por padrão o sistema decimal, é digamos assim, seu idioma na matemática. A máquina, internamente, entende por sua vez 2 sistemas, o hexadecimal e o binário, são seus idiomas matemáticos, poeticamente falando.

Considero desnecessárias estas conversões por 2 motivos:

  1. A observação acima tem um porém: se a comunicação se dá entre homem e máquina, tudo que nós precisamos saber é converter do nosso sistema (decimal) para os sistemas da máquina (binário e hexadecimal) e fazer o caminho inverso, converter dos sistemas da máquina (binário e hexadecimal) para o nosso sistema (decimal). Realizar conversões entre binário e hexadecimal por exemplo, é inútil e não precisamos estudar isso aqui. Seria o mesmo que dizer: vou traduzir de um idioma que não falo para outro que não entendo. Não teríamos proveito algum com isto.
  2. As traduções são automáticas, uma vez que ambos os sistemas são da própria máquina. Explico a seguir:

No texto anterior expus a correspondência entre os números binários com até 4 bits e os hexadecimais e o motivo pelo qual ambos sistemas surgiram. Portanto para converter de um sistema para outro, basta separar os binários em grupos de 4 caracteres e traduzir para o correspondente hexadecimal e vice versa. Por exemplo:

Ou seja, o binário e o hexadecimal são correspondentes automáticos e não requerem qualquer cálculo:

O 9 hexadecimal corresponde ao 1001 binário, 8 ao 1000, 3 ao 0011 e F ao 1111. Basta encontrar o equivalente e escrever em sequência sem qualquer segredo, e isto vale para qualquer conversão entre binário e hexadecimal.

Lidamos neste texto com as conversões possíveis entre as bases numéricas apresentadas no texto anterior. Até aqui, espero que tudo esteja claro.

Testes:

Só avance quando for capaz de responder às seguintes questões.

  1. Como se converte um número da base binária ou hexadecimal para a base decimal?
  2. Como se converte um número da base decimal para as bases binária e hexadecimal?
  3. Como se converte um número binário para hexadecimal e vice-versa?
  4. Quais números o homem e máquina entendem?
  5. Desafie-se e realize no mínimo 5 conversões de cada tipo.

Se sozinho você não conseguir respondê-las, não prossiga, tire suas dúvidas até que realmente entenda o assunto e só depois prossiga.

No texto seguinte vamos entrar em operações com bits e tabela ASCII.

Em caso de dúvidas peço que me escrevam sem hesitar: ricardo.roveran@hotmail.com

Assembly – Conversões entre bases numéricas (decimal, binária e hexadecimal)

Anúncios