No nosso habitual dia a dia trabalhamos com números. Todos estamos habituados a ver números compostos pelos dígitos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. Porém, há sistemas, nomeadamente os sistemas informáticos, que usam outros tipos de numeração.
Para já, é bom acostumarmo-nos já à ideia que a nossa numeração quotidiana tem um nome e chama-se decimal (de 10 dígitos, de 0 a 9). E ainda que temos “pesos” para cada “casa”: Unidades, dezenas, centenas, milhares, etc…
Ainda, não existe apenas o sistema de numeração decimal, existe outros sistemas de numeração, ou bases numéricas!
Base 10 – Decimal
Pode parecer um pouco ridículo o seguinte cálculo, mas será bastante útil para outros sistemas de numeração. Imagine-se o número:
15943
É um exercício da primária, mas recordemos que temos 3 unidades (peso de 1), 4 dezenas (peso de 10), 9 centenas (peso de 100), 5 milhares (peso de 1000) e 1 dezena de milhar (peso de 10000). Repare que, da direita para a esquerda – das dezenas para os milhares – o peso vai aumentando numa relação exponencial de base 10. De facto, temos:
Potência | Descrição |
---|---|
100 = 1 | casa das unidades (menor peso) |
101 = 10 | casa das dezenas |
102 = 100 | casa das centenas |
103 = 1000 | casa dos milhares |
104 = 10000 | casa das dezenas de milhares (maior peso) |
Com apoio na seguinte tabela, poderíamos olhar para o nosso número da seguinte forma:
Dez. Milhares | Milhares | Centenas | Dezenas | Unidades |
---|---|---|---|---|
104 = 10000 | 103 = 1000 | 102 = 100 | 101 = 10 | 100 = 1 |
1 | 5 | 9 | 4 | 3 |
Pode também parecer ridículo as seguintes divisões sucessivas por 10, mas repare-se que:
Pegando no último resultado e juntando os restos das divisões inteiras de baixo para cima, obtém-se o nosso número: 15943.
Base 2 – Binário
Vejamos agora o caso dos computadores. O processador (CPU) e demais dispositivos lógicos que fazem parte de um computador, funcionam com 2 níveis de tensão eléctrica para designar um estado OFF, Falso ou 0 e um estado ON, Verdade ou 1. Estamos, portanto, perante uma representação binária pois só temos 2 estados possíveis.
Consequentemente, todo o sistema numérico de um computador está limitado a estes 2 estados ON / OFF, Verdade / Falso, 1 / 0. Ficamos então reduzidos a dois dígitos: O 0 e o 1. Dizemos por isso que estamos perante um sistema de numeração binário ou de base 2!
Agora a questão que nos surge é: Como poderei representar um número binário no meu sistema numérico decimal e vice-versa?
Tomemos por exemplo o seguinte número binário:
110101
À semelhança da nossa numeração decimal, os dígitos binários (também conhecidos por BIT – BInary digiT) têm um peso menor no bit mais à direita e um peso maior no bit mais à esquerda. A principal diferença é que o peso de cada bit aumenta numa relação exponencial de base 2.
Repare que na nossa numeração decimal temos 10 dígitos, por isso o peso é representado por potências de base 10. Agora, nos números binários temos 2 dígitos e por isso o peso ser representado por potências de base 2.
Se construirmos uma tabela semelhante à que fizemos no exemplo básico do número decimal, mas usando agora potências de base 2, temos:
MSB | LSB | ||||
---|---|---|---|---|---|
25 = 32 | 24 = 16 | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 |
1 | 1 | 0 | 1 | 0 | 1 |
Ou seja, efectuando agora os cálculos:
Concluímos, então, que o nosso número binário (em base 2) 110101 é igual a 53 no nosso sistema decimal (base 10).
Já agora, dizemos que o bit mais à direita é o bit menos significativo (de menor peso) – LSB (Less Significant Bit) – e o bit mais à esquerda é o bit mais significativo (de maior peso) – MSB (Most Significant Bit) – tal como está indicado na tabela acima.
Quando trabalhamos com diferentes bases numéricas deveremos sempre indicar a base da seguinte forma:
110101 (2) = 53 (10)
No caso da numeração decimal, a divisão sucessiva por 10 parecia ridícula. De facto, estaríamos a proceder como se estivéssemos a converter um número da base 10 para a base 10…
Hum… alguém falou em converter da base 10 para uma base N? Pois é, se no exemplo “ridículo” temos divisões por 10, nos restantes casos de interesse temos divisões sucessivas por N!
Então, se pretendermos saber qual a representação em binário do número decimal 53, bastará fazer as seguintes divisões sucessivas por 2.
De forma análoga, pegamos no último resultado e juntamos os restos da divisão inteira de baixo para cima.
Assim, temos novamente o número binário: 1 1 0 1 0 1
Trabalhar directamente com binários não é fácil, sobretudo quando recuamos no tempo para os tempos da informática “pré-histórica”. Nesse tempo, quase toda a programação era feita a nível da máquina e a necessidade de representar grupos de bits com alguma numeração mais “humana” fez surgir outras bases numéricas: A octal e a hexadecimal.
Base 8 – Octal
Falemos agora do sistema de numeração octal. Como o nome sugere, é um sistema composto por 8 dígitos de 0 a 7. De forma análoga ao que já foi explicado, podemos concluir que o peso destes números estará relacionado com potências de base 8.
Consideremos, então, o seguinte número octal:
65
Voltemos a criar uma tabela, desta vez com potências de base 8:
81 = 8 | 80 = 1 |
6 | 5 |
Facilmente calculamos:
Ou seja, temos que:
65(8) = 53(10)
Já para calcular de decimal para octal, voltamos a usar as divisões sucessivas, neste caso por 8.
Não vou representar o cálculo como fiz atrás pois facilmente deduzimos que 53 ÷ 8 dá 6 e resto 5. Logo, temos 65 em octal.
Se observarmos que 3 bits têm 8 combinações possíveis, 23 = 8, facilmente podemos concluir que cada número octal, também conhecido por octeto, pode representar grupos de 3 bits. Neste caso, a conversão entre octal e binário é extremamente simples.
Observemos novamente o número octal 65 e converta-se cada um dos seus dígitos para binário, usando divisões sucessivas por 2:
Como cada octeto tem um peso de potências de base 8, assim como cada grupo de 3 bits, podemos agrupar os resultados em binário da forma:
1 1 0 (para 6) e 1 0 1 (para 5), ou seja, temos o número binário, já conhecido, 1 1 0 1 0 1
Isto é:
65(8) = 110101(2) = 53(10)
Já o contrário é igualmente fácil se seguirmos o mesmo princípio e termos grupos de 3 bits:
22 = 4 | 21 = 2 | 20 = 1 | 22 = 4 | 21 = 2 | 20 = 1 | |
1 | 1 | 0 | 1 | 0 | 1 |
Teremos então, para cada grupo, os seguintes cálculos:
Ou seja:
110101(2) = 65(8) = 53(10)
Base 16 – Hexadecimal
Porém, o sistema octal já caiu em desuso faz vários anos. Hoje em dia, quando trabalhamos com binários, trabalhamos com múltiplos de 8 bits (em cada cada grupo de 8 bits representa o que chamamos de byte). Se dividirmos cada grupo de 8 bits em grupos de 4 bits teremos 16 combinações possíveis – 24 = 16 – e assim surge o sistema de numeração hexadecimal, ou de base 16.
No sistema hexadecimal, temos 16 dígitos compostos pelos números de 0 a 9 e as letras de A a F. A tabela seguinte mostra a relação entre a numeração decimal de 0 a 15 e a numeração hexadecimal de 0 a F, tendo também, na primeira coluna, a representação em binário:
Binário (base 2) | Decimal (base 10) | Hexadecimal (base 16) |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
Desta tabela podemos observar várias coisas interessantes:
- Para os valores hexadecimais, as letras representam: A = 10; B = 11; C = 12; D = 13 ; E = 14 e F = 15.
- Num número binário é muito fácil identificar quando este representa um número decimal par ou ímpar. Repare-se que todos os números pares terminam com o LSB a 0 e todos os números ímpares com o LSB a 1. (LSB = Less Significant Bit – bit de menor peso, que está mais à direita, como já foi referido atrás)
- Observando atentamente as colunas dos números binários, vamos vendo quando estas vão – da direita para a esquerda – tomando o valor 1. Concluímos, com base no campo das probabilidades, que: Com 1 bit apenas temos 2 combinações (21 = 2) – 0 ou 1; Com 2 bits temos 4 combinações (22 = 4) – 00, 01, 10 e 11; Com 3 bits temos 8 combinações (23 = 8) – veja a primeira metade da tabela; Com 4 bits temos 16 combinações (24 = 16) – toda a tabela! Observe novamente a tabela tomando especial atenção à ordenação dos binários.
Voltemos agora à questão das conversões para decimal e consideremos agora um número maior.
Seja, então, considerado o seguinte número hexadecimal:
8A1D
Lembre-se que:
- A tem o valor de 10
- D tem o valor de 13
- Nota: Este número hexadecimal também pode ser representado por 841Dh ou 0x841D
Façamos a famosa tabela, agora com potências de base 16:
163 = 4096 | 162 = 256 | 161 = 16 | 160 = 1 |
8 | A | 1 | D |
Teremos, então, os seguintes cálculos:
Isto é:
8A1D(16) = 35357(10) (ou 8A1Dh = 35357)
Façamos, agora, a conversão de decimal para hexadecimal, usando divisões sucessivas por 16:
Temos então o último resultado 8 e os restos, de baixo para cima, 10, 1 e 13. Isto é:
35357(10) = 8A1D(16) (ou 35357 = 8A1Dh)
Por fim, repare-se o quão fácil é passar de hexadecimal para binário e vice-versa!
8 | A | 1 | D |
1000 | 1010 | 0001 | 1101 |
Desta vez não foram feitos os cálculos, mas a esta altura, e com o auxílio da tabela com a representação destes valores, o leitor deverá chegar facilmente a estes resultados.
Já agora, façamos só uma última conversão deste binário para octal:
(00) 1 | 0 0 0 | 1 0 1 | 0 0 0 | 0 1 1 | 1 0 1 |
1 | 0 | 5 | 0 | 3 | 5 |
Temos, então, os seguintes valores para as diferentes bases:
1000 1010 0001 1101 (2) = 105035 (8) = 35357 (10) = 8A1D (16)
NOTA HISTÓRICA: A base 8 (octal)
Os leitores podem-se questionar o porquê de uma base octal. Vimos que um número octal pode ser convertido em binário em grupos de 3 bits, pois 23 = 8. Um conjunto de 6 bits será facilmente representado por 2 algarismos em base 8 e vice-versa.
A resposta a esta questão está no que era um byte na aurora da informática. Enquanto hoje, um byte é representado por 8 bits (e daí ser habitual usar o sistema hexadecimal em que cada algarismo representa um grupo de 4 bits), nos primórdios dos tempos um byte era representado por 6 bits.
Este artigo foi escrito com a antiga grafia.