Você está na página 1de 18

CAPÍTULO

Sistemas de numeração
2.1As bases

Decimal

Binária

Hexadecimal

2.2Conversão entre bases

2.3BCD e BCD compactado

2.4Código Gray

2.5Codificação ASCII

2.6Exercícios

“Números perfeitos, assim como homens perfeitos, são muito raros.”

René Descartes

Para poder trabalhar com a informação é necessário representá-la em um formato


acessível. A música, por exemplo, possui diversas características que devem ser
informadas para que ela seja tocada corretamente. Para executar uma nota devemos
saber sua intensidade, frequência e duração. A tabela 2.1 apresenta uma listagem com
essas informações para as quatro primeiras notas de uma música:
Tabela 2.1: Sequenciamento de notas musicais
Tempo Frequência (nota) Intensidade
10 ms 440 15
12 ms 720 30
5 ms 0 0 (sem som)
12 ms 720 30
Este modo de representação, apesar de correto, não é adequado para os músicos,
principalmente por ocupar muito espaço e dificultar a leitura durante a execução da
música.
Para isso foi desenvolvida a partitura. Ela apresenta as notas de um modo gráfico
mais natural para os músicos, como na figura 2.1. Esta mudança de formato faz com que
mais informações sejam disponibilizadas, como a relação entre duas notas e como é o
andamento da melodia. Apesar desta informação também estar disponível na tabela, o
formato em que os dados são apresentados pode simplificar a leitura e utilização dos
dados.

Figura 2.1: Partitura musical

Muitas das informações que desejamos armazenar são formadas por quantidades.
A ideia de representar uma quantidade através de símbolos é bastante antiga. A
representação atual é baseada nos algarismos arábicos, através de uma base decimal.
No entanto, para simplificar o desenvolvimento dos computadores, adotou-se a
base binária. Isto permitiu a criação de sistemas mais estáveis e robustos. Na base binária,
cada posição de um número pode conter apenas os valores 0 ou 1.
Neste capítulo abordaremos as diferentes bases comumente utilizadas em
computação e também as diferentes representações destes números.
2.1 As bases

As bases mais utilizadas durante a programação dos sistemas embarcados são a


decimal, por ser a base que utilizamos no dia a dia, a binária, por ser o modo que os
processadores trabalham, e a hexadecimal. Esta última serve para facilitar a leitura ou a
operação com números binários, principalmente por reduzir a quantidade de algarismos
exibidos.
No entanto devemos ressaltar que dentro do processador todos os números são
armazenados em binário, até mesmo as letras de um texto.

Decimal

Um número é composto por diferentes algarismos. Para saber quanto um algarismo


contribui para o número precisamos de duas informações: o valor do algarismo e a
posição que se encontra. A figura 2.2, apresenta o número 1234, na base decimal. Este
número é formado por 4 algarismos.

Figura 2.2: Valor dos algarismos

O valor do número pode ser definido de acordo com a posição de cada algarismo.
Neste caso o número 1 vale 1000, o 2 vale 200, o 3 vale 30 e o 4 vale 4. O resultado final é
a soma destes valores. Este processo está representado na figura 2.3:
Figura 2.3: Algarismos de milhar, centena, dezena e unidade

A valor final pode ser definido como a soma de cada algarismo multiplicado por
uma potência de 10. O expoente da potência depende da posição do algarismo no
número:

Este é um conceito relativamente simples. O que estamos fazendo ao criar um


número na base 10 é contar quantas vezes uma quantidade é múltipla de 1 (100) 10 (101),
de 100 (102), de 1000 (103), etc. Para as demais bases a ideia é a mesma, mas ao invés de
usarmos o valor 10 como base, utilizaremos os valores 2 para a binária e 16 para a
hexadecimal. A representação matemática de um número N na base B é dada
por Nb conforme a equação a seguir:

Para que essa formulação seja válida, os valores devem obedecer a seguinte
equação:

Binária

Conforme apresentado, a base binária possui grande utilidade em sistemas


computacionais por ser o modo como, em geral, os computadores armazenam e
executam as operações com números.
Especificando, a notação matemática de uma base genérica para uma base 2, temos
que um número na base 2 (N2) será representado por:
Esta expressão diz que um algarismo num número binário representa a existência
de um valor numa potência de 2, como representado na figura 2.4. Na figura podemos
ver que cada digito dn representa um valor igual ao dobro do digito d .
Os algarismos do número apresentado na figura 2.4, podem ser apenas zero ou um.
Deste modo, na soma, o algarismo indica a presença (1) ou ausência (0) daquela potência
de dois no número final. A figura 2.5 apresenta um exemplo de um número binário com
5 algarismos.

Figura 2.4: Valores dos algarismos num número binário


Figura 2.5: Exemplo de número binário

A figura 2.6 apresenta uma tabela com os valores de conversão de binário para
decimal.

Figura 2.6: Tabela de conversão binário-decimal


Hexadecimal

A base binária representa como os números são armazenados e manipulados pelo


processador. No entanto, um número com vários zeros e uns é de difícil assimilação pelo
ser humano. Isto pode induzir a erros, principalmente quando estamos manipulando
esses números.
Visando simplificar a escrita desses números, é comum utilizarmos a base
hexadecimal. Esta base funciona com 16 algarismos, de modo que cada posição é
representada por uma potência de 16.

Como existem apenas 10 algarismos, utilizamos as seis primeiras letras do alfabeto


para completar os algarismos. Deste modo, o caractere “A” representa a quantidade 10,
o caractere “B” o valor 11 e assim por diante até o caractere “F” que representa 15.
A figura 2.7 apresenta os valores de cada uma das posições num número hexadecimal.

Figura 2.7: Valores dos algarismos num número hexadecimal

Tomemos por exemplo o número F20C16. O caractere “C” indica que na primeira
posição temos C (12) unidades de base 16, cujo valor de cada unidade é 160 = 1. Já o
caractere 2 indica que este número possui duas quantidades na terceira posição. Isto
indica que este número vale 2 × 162, totalizando 512. A mesma coisa acontece para o
caractere “F”. A figura 2.8 apresenta essa informação de modo gráfico:

Figura 2.8: Exemplo de número hexadecimal

2.2 Conversão entre bases

Como já foi apresentado, as bases são apenas um modo de escrever a mesma


quantidade. Veja a figura 2.9, por exemplo. Fazendo a contagem na base decimal,
existem 8 pontos ou 810. Se quisermos armazenar a mesma quantidade na base binária,
teremos o valor 1002.

Figura 2.9: Processo de conversão entre bases

Todas as três bases apresentadas, binária, decimal e hexadecimal, possuem


utilidade na hora de programar para um processador. É bastante comum que em um
determinado tempo desejamos saber qual o valor de uma determinada quantidade em
diferentes bases, como no caso dos pontos. Se estivermos conversando com alguém,
diremos que existem 810 pontos. No entanto, se formos armazenar esse número no
computador, ele será salvo como o valor 1002.
Para converter um número N, que está numa base decimal, para uma base Y, basta
dividirmos N por Y sucessivas vezes enquanto anotamos o resto de cada divisão.
Continuamos esse procedimento até o resultado ser zero.
Por exemplo, para converter 5610 na base 3 podemos dividir o número por 3 e anotar
os resultados.

56/3 = 18 resto 2
18/3 = 9 resto 0
9/3 = 3 resto 0
3/3 = 1 resto 0
1/3 = 0 resto 1

Anotando todos os valores de resto, da última divisão para a primeira, temos o


número 10002 na base 3, que equivale ao número 56 na base decimal. Portanto a
conversão de decimal para binário, ou de hexadecimal para binário, pode ser feita
através das divisões sucessivas. A figura 2.10 apresenta a conversão do número
23110 para binário e hexadecimal através deste processo.

Figura 2.10: Exemplo de conversão utilizando divisões

O processo para converter um número N na base Y para a base decimal é feito


somando-se os algarismos em cada posição do número N, levando-se em conta a base
utilizada. Por exemplo, convertendo o número 10432 na base 5 para uma base decimal.
Se este número está na base 5, cada posição é um múltiplo de 5. A primeira posição
indica a quantidade de valores 50, a segunda posição a quantidade de 51 e assim por
diante.
A primeira posição, da direita para a esquerda, será o algarismo 2. 2 × 50 = 5. Já o
algarismo 3 representa que o número em questão possui três unidades na posição dois,
ou seja, 3 × 52. Deste modo, podemos expressar o número 104325 como:

104325 = (1 × 54) + (0 × 53) + (4 × 52) + (3 × 51) + (2 × 50)

104325 = (1 × 625) + (0 × 125) + (4 × 25) + (3 × 5) + (2 × 1)

104325 = 625 + 0 + 100 + 15 + 1 = 74110

Para converter as outras bases para a base decimal podemos fazer o mesmo
procedimento. Por exemplo, convertendo o número 13F416 temos:

13F416 = (1 × 163) + (3 × 162) + (F × 161) + (4 × 160)

13F416 = (1 × 4096) + (3 × 256) + (15 × 16) + (4 × 1)

104325 = 4096 + 768 + 240 + 4 = 510810

Para o número binário 100101112 podemos fazer:

100101112 = (1 × 27) + (0 × 26) + (0 × 25) + (1 × 24) + (0 × 23) + (1 × 22) + (1 × 21) + (1 × 20)

100101112 = (1 × 128) + (0 × 64) + (0 × 32) + (1 × 16) + (0 × 8) + (1 × 4) + (1 × 2) + (1 × 1)

100101112 = 128 + 0 + 0 + 16 + 0 + 4 + 2 + 1 = 15110

A conversão de binário para hexadecimal, ou de hexadecimal para binário, pode


ser feita de um modo bem mais simples. Primeiramente, separamos os algarismos do
número binário em grupos de 4 algarismos, da direita para a esquerda. Para cada grupo
de 4 algarismos basta então utilizar a tabela 2.2 como ferramenta de conversão.

Tabela 2.2: Representação decimal – binária – hexadecimal


Decimal Binária Hex. Decimal Binária Hex.
0 0000 0 8 1000 8
1 0001 1 9 1001 9
2 0010 2 10 1010 A
3 0011 3 11 1011 B
4 0100 4 12 1100 C
5 0101 5 13 1101 D
6 0110 6 14 1110 E
7 0111 7 15 1111 F
Por exemplo, o número 18. Sabemos que este número na representação binária é
dado por 100102. Utilizando o procedimento citado, podemos agrupá-lo em dois
conjuntos 1 e 00102.
Da tabela 2.2 podemos verificar que 12 é equivalente a 116 e que 00102 pode ser
representado pelo número 216. Logo podemos definir que 100102 pode ser representado
em hexadecimal por 1216.

2.3 BCD e BCD compactado

Alguns dispositivos possuem modos diferentes de interpretar as informações


armazenadas em base binária. Alguns destes dispositivos separam um byte, um
conjunto de 8 bits, em dois nibbles, um conjunto de 4 bits. A figura 2.11 apresenta esta
relação.
Cada nibble pode contar de zero a 11112, o que em decimal significa uma variação
de zero a 15. No entanto, para simplificar a utilização dos dispositivos, optou-se por
armazenar apenas valores de zero a 9. Este tipo de codificação é conhecido como BCD -
Binary Coded Decimal, ou Decimal Codificado em Binário. A ideia é que os números em
decimal possam ser armazenados diretamente em binário, onde cada posição da
memória guardaria um algarismo decimal.
Apesar de facilitar a utilização em alguns casos, essa abordagem diminui a
capacidade de armazenamento dos valores, pois cada byte, que antes podia contar até
255, agora só armazena valores de zero a 9.

Figura 2.11: Relação entre bit, nibble e byte


Uma alternativa para melhorar essa estrutura é o BCD compactado. Para armazenar
valores de zero a 9 são precisos apenas 4 bits. Por este motivo, em cada byte de um
número em BCD, quatro bits ficavam sem utilização. O BCD compactado agrupa então
dois números codificados em BCD utilizando apenas um byte, conforme figura 2.12:

Figura 2.12: Representação de um número BCD compactado

Apesar de facilitar o uso dos dados em algumas situações, deve-se ter muito
cuidado no uso de variáveis cujos valores representam BCD’s compactados. Qualquer
processo de cálculo envolvendo essas variáveis deve ser realizado levando-se em
consideração as diferenças para uma variável regular.
Como cada nibble (conjunto de 4 bits) é utilizado para armazenar apenas um dígito,
um byte, que normalmente pode contar de zero a 256, agora está em valores limitados
de zero a 99.

2.4 Código Gray

Uma outra codificação bastante utilizada é o código Gray. Este código foi
inicialmente utilizado para reduzir os erros que surgiam na transição dos encoders,
equipamentos utilizados para medição de elementos rotativos. A ideia é criar uma
sequência de valores, em binário, onde o próximo valor possua apenas um bit de
diferença do anterior. Esta característica é muito útil ao se implementar sistemas que
utilizem leitura de posições sequenciais, como nos encoders.
A figura 2.13 apresenta dois discos, codificados em binário. Neste exemplo
poderiam ser utilizados até três sensores, um em cada uma das três faixas. O sensor
retornaria o valor 1 se a área debaixo do sensor for branca e zero se a área for preta. Deste
modo, podemos identificar em qual das oito posições o sensor se encontra.

Figura 2.13: Disco rotativo em código binário e código Gray

Este é o funcionamento básico do encoder que atua como um sensor angular, como
um controle de volume, por exemplo. Se for preciso aumentar a precisão, basta adicionar
mais faixas e mais sensores.
A figura 2.14 apresenta a contagem de zero a 7 nos códigos binário e gray. Podemos
perceber que no código gray apenas um bit é alterado a cada linha. Já o código binário
chega a modificar até 3 bits de uma única vez.
Figura 2.14: Tabela de conversão Binário-Decimal-Gray

Ambos os códigos, binário simples ou gray, conseguem identificar corretamente


todas as áreas. A vantagem do código gray pode ser observada quando consideramos os
erros que podem acontecer no sistema: problemas na impressão dos discos pintados,
desalinhamento ou posicionamento dos sensores e até mesmo da vibração do
equipamento enquanto estiver em uso.
A figura 2.15 apresenta novamente os dois discos dando ênfase nas bordas das
impressões das áreas. Ambos os discos apresentam algum tipo de erro de impressão.
Figura 2.15: Disco rotativo em código Gray

Podemos notar que o disco 1 apresenta um valor errado entre os dois valores
corretos. Já o disco codificado em gray apresenta apenas um atraso no valor correto, mas
não apresenta um valor discrepante na mudança.

2.5 Codificação ASCII

Os computadores apenas armazenam e manipulam valores codificados em binário.


Deste modo, qualquer tipo de informação, som, imagem ou texto tem que ser codificado
em valores binários.
Para codificar um texto é preciso adotar um valor binário para cada letra do alfabeto.
O código mais simples é o ASCII ou American Standard Code for Information
Interchange.
O protocolo ASCII foi originalmente baseado no alfabeto inglês, sendo derivado
dos primeiros códigos eletrônicos para transmissão de mensagens através de telégrafos.
A principal motivação para o desenvolvimento desse código foi a necessidade de incluir
letras minúsculas e marcações de pontuação nas mensagens.
Dado o espaço disponível, de 7 bits, foi possível codificar letras maiúsculas,
minúsculas, pontuação, símbolos gráficos e comandos de controle. Os comandos eram
ações especiais que seriam tomadas pelo equipamento que estivesse lendo a mensagem.
A primeira padronização deste código foi feita em maio de 1963 com a votação da
inclusão das letras em minúsculas no padrão. A versão atual desse código é a ANSI X3.4,
de 1986. A tabela 2.3 relaciona os valores, em hexadecimal, e os símbolos gráficos
definidos nesta norma:

Tabela 2.3: Codificação dos caracteres em ASCII


Hex Cmd Escape Code Hex Char Hex Char Hex Char
0 NUL \0 20 (space) 40 @ 60 ‘
1 SOH 21 ! 41 A 61 a
2 STX 22 “ 42 B 62 b
3 ETX 23 # 43 C 63 c
4 EOT 24 $ 44 D 64 d
5 ENQ 25 % 45 E 65 e
6 ACK 26 & 46 F 66 f
7 BEL \a 27 ’ 47 G 67 g
8 BS \b 28 ( 48 H 68 h
9 HT \t 29 ) 49 I 69 i
0A LF \n 2A * 4A J 6A j
0B VT \v 2B + 4B K 6B k
0C FF \f 2C , 4C L 6C l
0D CR \r 2D - 4D M 6D m
0E SO 2E . 4E N 6E n
0F SI 2F / 4F O 6F o
10 DLE 30 0 50 P 70 p
11 DC1 31 1 51 Q 71 q
12 DC2 32 2 52 R 72 r
13 DC3 33 3 53 S 73 s
14 DC4 34 4 54 T 74 t
15 NAK 35 5 55 U 75 u
16 SYN 36 6 56 V 76 v
17 ETB 37 7 57 W 77 w
18 CAN 38 8 58 X 78 x
19 EM 39 9 59 Y 79 y
1A SUB 3A : 5A Z 7A z
1B ESC \e 3B ; 5B [ 7B {
1C FS 3C < 5C \ 7C |
1D GS 3D = 5D ] 7D }
1E RS 3E > 5E ^ 7E
1F US 3F ? 5F _ 7F DEL
A criação da tabela levou em conta a melhor organização dos símbolos e suas
funções. O espaço disponível, de zero a 127, foi dividido em 4 seções.
A primeira seção abriga os comandos como mudança de linha, quebra de página,
entre outros. A única exceção é o comando DEL, que apaga a letra à direita do cursor,
pois se encontra na última posição da tabela. Este comando foi padronizado muito
tempo depois da criação da tabela original, e por isso havia sobrado apenas essa posição
para ele.
Os comandos foram concebidos para controlar os primeiros equipamentos de
impressão, sendo que vários deles não são mais utilizados. Entre os comandos ainda
utilizados, temos o LF (0x0A), que funciona como indicador de mudança de linha.
Alguns sistemas utilizam o LF em conjunto com o CR (0x0D) para indicar uma nova
linha. Para utilizar esses comandos na linguagem C costumam-se utilizar códigos de
escape para inserir esses caracteres especiais no texto.
A segunda seção abrange a grande maioria dos símbolos de pontuação e caracteres
matemáticos, incluindo os números arábicos. Estes símbolos foram posicionados
levando-se em conta a sequência em que aparecem nas antigas maquinas de escrever.
Atualmente, algumas mudanças foram feitas nos teclados modernos, deste modo, a
sequência física não corresponde exatamente à sequência lógica da tabela, o que não é
no entanto, um problema grave.
Por fim, a terceira seção abriga as letras maiúsculas e a quarta, as correspondentes
minúsculas. Elas estão organizadas de modo que a diferença entre as maiúsculas e
minúsculas é de apenas um bit, facilitando os algoritmos de ordenação de textos.
O código ASCII define apenas os caracteres da língua inglesa, ocupando as posições
de 0 à 7F16 (12710), não possuindo caracteres acentuados ou o alfabeto grego, o cirílico etc.
Para dar suporte a estes caracteres outras codificações foram desenvolvidas. Os códigos
mais utilizados atualmente são o UTF-8 e o ISO-8859, que possuem compatibilidade com
o ASCII, ou seja, as primeiras 127 posições são as mesmas.

2.6 Exercícios

Ex. 2.1 — Qual a vantagem da base hexadecimal?

Ex. 2.2 — Onde é utilizado o código Gray?

Ex. 2.3 — Porque o código ASCII não apresenta suporte a acentos?


Ex. 2.4 — Converta os seguintes números da base decimal para a base binária:
•10
•255
•32
•1984

Ex. 2.5 — Converta os seguintes números da base hexadecimal para a base binária:
•0x125
•0xAA
•0x55
•0x15FB
•0x4B1D
•0xAA030586

Ex. 2.6 — Qual a diferença de um número codificado em BCD compactado ou em


hexadecimal?

Você também pode gostar