You are on page 1of 17

Sistemas de Numeração, Codificação e Organização de Dados

1. Sistemas de Numeração:

Desde tempos remotos o homem utiliza a escrita para registrar e transmitir


informação. A escrita vai do antigo hieróglifo egípcio até o alfabeto latino atual.

O alfabeto, como conjunto de símbolos, se desenvolve originalmente na Grécia e


posteriormente em Roma e constitui a origem de nosso alfabeto atual.

Uma das primeiras tentativas de registro de quantidades sob a forma escrita foi o
sistema de numeração indo-arábico, do qual são derivados os atuais sistemas de numeração
decimal.

Sistema de numeração é o conjunto de símbolos utilizados para representação de


quantidades e as regras que definem a forma de representação. Um sistema de numeração é
determinado fundamentalmente pela base (número de símbolos utilizados). A base é o
coeficiente que determina qual o valor de cada símbolo de acordo com a sua posição.

Muitos sistemas modernos de computação não representam valores numéricos


usando o sistema decimal. Em vez disso, eles simplesmente usam o binário ou o sistema de
numeração de complemento de dois. Para entender as limitações da aritmética do
computador, você deve entender como os computadores representam os números.

1.1 Uma Revisão do Sistema Decimal:

Você já deve ter utilizado o sistema decimal (base 10) por tanto tempo que
provavelmente o acha muito natural. Quando você vê um número como "123", você não
pensa sobre o valor 123; ao contrário, você gera uma imagem mental de quantos itens este
valor representa. Na realidade, contudo, o número 123 representa:

1 Centena
+ 2 Dezenas
+ 3 Unidades

Ou seja:
123 10 = 1 ⋅ 10 2
+ 2 ⋅ 10 1 + 3 ⋅ 10 0

Cada dígito aparecendo à esquerda do ponto decimal (ou da virgular, conforme a


preferência) representa um valor entre 0 e 9 que multiplica uma potência positiva de base
dez.

De modo semelhante, dígitos aparecendo à direita do ponto decimal representam


um valor entre 0 e 9 que multiplica uma potência negativa de base dez.

Por exemplo, o valor 123,456 significa:

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 1


123,45610 = 1 ⋅ 10 2 + 2 ⋅ 101 + 3 ⋅ 10 0 + 4 ⋅ 10 −1 + 5 ⋅ 10 −2 + 6 ⋅ 10 −3

Ou seja:
100 + 20 + 3 + 0.4 + 0.05 + 0.006 = 123,456 10

1.2 O Sistema de Numeração Binário

Muitos dos modernos sistemas de computação (incluindo o IBM PC e seus


descendentes) operam utilizando a lógica binária. O computador representa valores
utilizando dois níveis de tensão elétrica (geralmente 0v e +5v). Com esses dois níveis nós
podemos representar exatamente dois valores. Esses podem ser quaisquer dois valores, mas
por convenção utilizamos os valores zero e um, ou seja, o sistema de numeração binário
possui apenas dois algarismos: 0 e 1. Por isso a sua base é dois (base 2  dois dígitos).

Assim, o sistema de numeração binário funciona exatamente como o sistema


decimal, com duas exceções:

 O sistema binário permite apenas os dígitos 0 e 1 (e não 0-9);

 O sistema binário utiliza potências de dois, o que é diferente das


potências de dez.

Cada algarismo ou digito binário é chamado de bit. Este termo “bit” tem origem na
contração de duas palavras inglesas “binary digit”, ou seja digito binário.

Então, é muito fácil converter um número em binário para decimal, pois vale as
mesmas regras:

Cada bit aparecendo à esquerda do ponto decimal representa um valor entre 0 e 1


que multiplica uma potência positiva de base dois.

De modo semelhante, dígitos aparecendo à direita do ponto decimal representam


um valor entre 0 e 1 que multiplica uma potência negativa de base dois..

Por exemplo, o valor binário 110010,1 representa:

110010,12 = 1 ⋅ 2 5 + 1 ⋅ 2 4 + 0 ⋅ 2 3 + 0 ⋅ 2 2 + 1 ⋅ 21 + 0 ⋅ 2 0 + 1 ⋅ 2 −1

110010,12 = 32 + 16 + 0 + 0 + 2 + 0 + 0,5

Ou seja: 110010,1 2 = 50,5 10

1.2.1 Conversão de números em decimal para números em binário

Para converter números em decimal para binário é um pouco mais difícil. Para
números em base 10 inteiros podemos seguir a seguinte técnica:

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 2


Toma-se o número decimal a ser convertido para binário e procede-se sucessivas
divisões por 2, com quocientes inteiros, e restos que poderão ser 0 ou 1. Divide-se
sucessivamente por 2, até obtermos um quociente igual a zero. O valor convertido
corresponde aos restos das divisões sucessivas, sendo que o último resto obtido é o
algarismo mais significativo do numero binário.

Exemplo: Converte 25210 para binário:

252 2
MENOS 0 126 2
SIGNIFICATIVO
0 63 2
1 31 2
1 15 2
1 7 2
1 3 2
1 1 2
1 0
MAIS SIGNIFICATIVO

Ou seja: 252 10 = 11111100 2

Muitas calculadoras cientificas fazem essas operações de conversão entre bases


numéricas, usando a função (modo) BinDec ou DecBin, mas a maioria delas só aceita
trabalhar com números binários e decimais inteiros para tais conversões.

A fim de conferir se o resultado da conversão exemplificada anteriormente está


realmente correto, podemos tirar uma prova de seu resultado, fazendo a reconversão:

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0


27 26 25 24 23 22 21 20
1 1 1 1 1 1 0 0
2
7 6 5 4 3 2 1 0
1.2 1.2 1.2 1.2 1.2 1.2 0.2 0.2
128 64 32 16 8 4 0 0 = 252 10

Uma outra técnica pode ser utilizada, e que é de fato a técnica mais usada pelos
profissionais mais experimentados na manipulação de números binários. Com a prática,
está técnica se torna mais rápida que a técnica de divisão sucessiva por dois. È necessário
apenas estar bem familiarizado com a potencia de base dois.

Exemplo: Suponhamos que desejamos converter o número 1257 10 para binário.

Vamos escrever então uma série de potência de base dois, que termine na maior
potências de dois (2n) que pode ser subtraída do número decimal o qual deseja-se
converter, desde que o resultado da diferença seja igual ou maior que zero.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 3


211 210 29 28 27 26 25 24 23 22 21 20

2048 1024 512 256 128 64 32 16 8 4 2 1

maior potências de dois que


ao ser subtraída de 1257
resultando em uma diferença A diferença
maior ou igual a zero é positiva

Então, fazemos a operação de subtração: 1257 10 – 1024 10 = 233 10

Uma vez realizada esta operação, assinalar o valor “1” na posição 210, como sendo
o algarismo mais significativo do número convertido;

1024 512 256 128 64 32 16 8 4 2 1


210 29 28 27 26 25 24 23 22 21 20
1

Caso a diferença tivesse sido igual a zero, nós deveríamos agora assinalar o valor
“0” para cada uma das potências de base dois imediatamente inferior (29; 28; 27, e assim
sucessivamente até atingir 20);

Mas caso resto um saldo de diferença, ou seja, uma diferença maior que zero, e que
neste caso é de 233 10, assim, devemos ir buscar na nossa série a próxima potência de base
dois imediatamente inferior, que no caso é 29, e tentar subtraí-la do saldo com a condição
de que o resultado da diferença seja igual ou maior que zero. Assinalar o valor “1” para o
caso dessa operação de subtração poder ser realizada, caso contrário assinalar “0”;

Bem, como a potência de base dois imediatamente inferior é 29, ou seja, 512 10,,
assim não é possível subtraí-la de 233 10, sem que o resultado fique negativo. Então não
vamos realizar esta subtração: vamos assinalar “0” e vamos prosseguir para a próxima
potência de base dois imediatamente inferior.

1024 512 256 128 64 32 16 8 4 0 0


210 29 28 27 26 25 24 23 22 21 20
1 0

Então damos uma olhada na nossa série e constatamos que a potência de base dois
imediatamente inferior é no caso 28, ou seja 256 e devemos tentar subtraí-la do saldo,
desde que o resultado da diferença seja igual ou maior que zero. Assinalar o valor “1” para
o caso dessa operação de subtração poder ser realizada, caso contrário assinalar “0”;

Como 256 10 é superior a 233 10, não fazemos a subtração, assinalamos “0” e
prosseguimos para a próxima potência imediatamente inferior.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 4


1024 512 256 128 64 32 16 8 4 2 1
210 29 28 27 26 25 24 23 22 21 20
1 0 0

A próxima potência de dois é 27 ou 128 10. Então, fazemos a operação de subtração:

233 10 – 128 10 = 105 10

Uma vez realizada esta operação, assinalar o valor “1” na posição 27, e prosseguir
para a próxima potencia de dois.

1024 512 256 128 64 32 16 8 4 2 1


10 9 8 7 6 5 4 3 2 1
2 2 2 2 2 2 2 2 2 2 20
1 0 0 1
Assim sucessivamente, prosseguimos testando a possibilidade de subtrair ou não o
valor da potência de dois do saldo restante e assinalando “1” se for possível subtrair e “0”
se não for possível subtrair, até alcançarmos a última posição, que no caso é 20., ou seja 1.

Assim, para o número decimal 1257, temos por fim o seguinte resultado:

1024 512 256 128 64 32 16 8 4 2 1


210 29 28 27 26 25 24 23 22 21 20
1 0 0 1 1 1 0 1 0 0 1

Para tirarmos a prova, basta somar todos os valores em decimal de cada uma das
potências de dois que foram assinalados por “1” na série:

Assim: 1024 + 128 + 64 + 32 + 8 + 1 = 1257

Números binários, embora tenham pequena importância em linguagens de alto


nível, aparecem por toda parte em programas em linguagem assembly.

1.2.2 Formatos Binários

Na verdade, todo número binário é formado por um número infinito de dígitos (ou
bits). Por exemplo, podemos representar em binário o número decimal 5 por:

Qualquer número de bits de valor zero pode


101 ou
preceder o número binário sem alterar o seu valor total.
00000101 ou
Adotamos a convenção de ignorar quaisquer zeros 0000000000101 ou
à esquerda. Por exemplo, o valor 1012 representa em 000000000000101
binário o número decimal cinco. Uma vez que os
microprocessadores e microcontroladores funcionam com grupos de bits, também
chamados barramentos de dados, com tamanhos que variam: 8 bits, 16 bits, 32 bits, etc, é
muito conveniente completar com zeros para estender todos os números binários para

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 5


algum de quatro ou oito bits. Então, seguindo esta convenção, representaremos o número
cinco como 01012 ou 000001012.

As pessoas, principalmente aquelas que estão trabalhando com números contábeis,


acostumaram-se a separar cada três dígitos com um ponto (ou uma virgula) para tornar
números grandes mais fáceis de ler. Por exemplo, 6.203.435.208 é muito mais fácil de ler e
compreender do que 6203435208. Adotaremos uma convenção similar nesta apostila para
números binários. Separaremos cada grupo de quatro bits binários com um espaço. Por
exemplo, o número binário 1010111110110010 será escrito 1010 1111 1011 0010.

O bit mais à direita em um número binário é o bit da posição zero (X0), e a cada bit
à esquerda tem o valor de índice incrementado de 1 sucessivamente.

Um valor binário de oito bits usa os bits de zero a sete:

X7 X6 X5 X4 X3 X2 X1 X0

Um valor binário de 16 bits usa as posições de zero até quinze:

X15 X14 X13 X12 X11 X10 X9 X8 X7 X6 X5 X4 X3 X2 X1 X0

O Bit mais à direita, X0, geralmente é referido como o “bit menos significativo”
(LSB – Less Significant Bit). O bit mais à esquerda é tipicamente chamado de alta ordem
(MSB – Most Significant Bit). Iremos nos referir aos bits intermediários pelos seus
respectivos números de índice.

1.3 O Sistema de Numeração Hexadecimal

Um grande problema com o sistema binário é a verbosidade. Para representar o


valor 128 10 em binário requer oito algarismos ou bits. A forma decimal requer apenas três
dígitos decimais e, assim, representa números muito mais compactamente do que o sistema
binário de numeração o faz.

Este fato não foi esquecido pelos engenheiros que desenvolveram os sistemas de
computadores binários. Quando tratam de valores grandes, números binários rapidamente
tornam-se pesados. Infelizmente, os computadores pensam em binário, então na maior
parte do tempo é conveniente utilizar o sistema binário de numeração.

O sistema de numeração hexadecimal (base 16) é bastante conveniente para


resolver esse problema, pois este sistema oferece duas características que procuramos:

 São muito compactos;


 É fácil convertê-los para binário e vice-versa.

Por causa disso, muitos dos sistemas de computação binários passaram a usar o
sistema hexadecimal de numeração. Uma vez que a base de um número hexadecimal é 16,
cada dígito à esquerda do ponto hexadecimal representa algum valor vezes uma potência
sucessiva de 16.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 6


Por exemplo, o número 1234 16 (hexadecimal) é igual à:

16 3 16 2 16 1 16 0
4096 256 16 1
1 2 3 4 16

1 . 16 3 2 . 16 2 3 . 16 1 4 . 16 0
4096 512 48 4 = 4660 10

Cada dígito hexadecimal pode representar um dos dezesseis valores entre 0 e 15.
Assim precisamos de 16 símbolos para representar os algarismo hexadecimal.

Usaremos para isso os mesmos símbolos usados no sistema decimal (0, 1, 2, ... , 9)
e, já que há apenas dez símbolos de dígitos decimais, precisamos “inventar” seis dígitos
adicionais para representar os valores no intervalo de 10 até 15. Ao invés de criar novos
símbolos para esses dígitos, usaremos as letras A até F, sendo A=10; B=11; C=12; D=13;
E=14 e F=15, respectivamente.

Exemplo de número hexadecimal válido: 2F5C 16 = 15964 10

16 3 16 2 16 1 16 0
4096 256 16 1
2 F 5 C 16

2 . 16 3 15 . 16 2 5 . 16 1 12 . 16 0
8192 7680 80 12 = 15964 10

Na maioria dos computadores não podemos entrar um subscrito para denotar o


valor da base de um número associado. Uma vez que freqüentemente precisaremos entrar
com números hexadecimais em um computador, vamos precisar de uma convenção
diferente para representar os números em hexadecimal. Em programação assembly é
bastante comum a seguinte convenção:

• Todo valor numérico começa com um símbolo decimal;

• Todo valor hexadecimal termina com a letra "h" – Ex: 2F5Ch ;

• Todo valor binário termina com a letra "b" – Ex: 1010 0110b;

• Números decimais podem ter um sufixo "t" ou "d".

1.3.1 Conversão de Números Binários  Hexadecimal

Como você pode ver, números em hexadecimal são compactos e fáceis de ler. Além
disso, você pode facilmente converter entre hexadecimal e binário e vice versa. Considere
o seguinte exemplo de número binário: 10111110110100 2

Para convertermos de binário para hexadecimal procedemos a seguinte técnica:

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 7


Dividimos o número binário em grupamentos de 4 bits a partir do bit menos
significativo: 10 1111 1011 0100 2 e tratamos cada grupamento como se fosse um
número isoladamente:

21 20 23 22 21 20 23 22 21 20 23 22 21 20
1 0 1 1 1 1 1 0 1 1 0 1 0 0 2
1.2 0 1.8 1.4 1.2 1.1 1.8 0 1.2 1.1 0 1.4 0 0
2 15 11 4
2 F B 4 16

Assim: 10 1111 1011 0100 2 = 2FB4 16

Já para convertermos de hexadecimal para binário procedemos a seguinte técnica:

Cada dígito hexadecimal deve gerar um grupo de 4 bits. Considere o seguinte


exemplo de número hexadecimal: 7D8 16

7 D 8 16

7 13 8
23 22 21 20 23 22 21 20 23 22 21 20
8 4 2 1 8 4 2 1 8 4 2 1
0 1 1 1 1 1 0 1 1 0 0 0 2

Portanto, 7D8 16 = 111 1101 1000 2

Considere também tabela a seguir, tabela, para Binário Hexadecimal


facilitar a tarefa de conversão Binário / Hexadecimal: 0000 0
0001 1
Esta tabela fornece toda a informação que você 0010 2
precisa para converter qualquer número hexadecimal em 0011 3
um número binário e vice-versa. Compare isto com a 0100 4
dificuldade da conversão entre decimal e binário ou 0101 5
decimal e hexadecimal! 0110 6
0111 7
Já que a conversão entre hexadecimal e binário é 1000 8
uma operação que você precisará efetuar repetidamente, 1001 9
você deveria gastar alguns minutos e memorizar a tabela 1010 A
ao lado. Mesmo se você tiver uma calculadora que fará a 1011 B
conversão para você, descobrirá que a conversão manual 1100 C
será muito mais fácil e conveniente quando tiver que 1101 D
converter entre binário e hexadecimal. 1110 E
1111 F
1.3.2 Conversão de Números Decimais para Hexadecimais

Para converter em decimal para hexadecimal é um pouco mais difícil. Para


números em base 10 inteiros podemos seguir a seguinte técnica:

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 8


Toma-se o número decimal a ser convertido para hexadecimal e procede-se
sucessivas divisões por 16, com quocientes inteiros, e restos que poderão variar entre 0 e
15. Divide-se sucessivamente por 16, até obtermos um quociente igual a zero. O valor
convertido corresponde aos restos das divisões sucessivas, sendo que o último resto obtido
é o algarismo mais significativo do numero hexadecimal.

Exemplo: Converte 523710 para hexadecimal:

5237 16
MENOS 5 327 16
SIGNIFICATIVO
7 20 16
4 1 16
1 0
MAIS SIGNIFICATIVO

Ou seja: 5237 10 = 1475 16

Para convertermos números em hexadecimal para decimal, podemos simplesmente


decompor o número em hexadecimal numa série de potências de base dezesseis. O
algarismo menos significativo do número hexadecimal é associado a base dezesseis de
expoente zero (160) e para cada algarismo a esquerda, incrementa-se em 1 o expoente da
base.

Exemplo: Converter 3FC16 para a base decimal:

162 161 160


256 16 1
3 F C 16

3 15 12
3 . 256 15 . 16 12 . 1
768 240 12 1020 10

Portanto: 3FC16 = 102010

1.4 O Sistema de Codificação BCD

A conversão de um número decimal no seu equivalente binário é chamada


codificação. Um número decimal expresso como um código binário ou número binário.
como foi apresentado até aqui, é conhecido como código binário puro. Usamos este nome
para diferenciá-lo de outros tipos de códigos binários usados em computadores. Destes
outros código, o mais aplicado é o código BCD.

1.4.1 O Código BCD 8421:

O código BCD é uma forma de representação decimal, ou seja, é um sistema de


representação dos algarismos decimais de 0 até 9 com um código binário de 4 bits. A

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 9


diferença entre representar um número decimal em código binário puro e em BCD é que,
ao usarmos o código binário puro convertemos “o valor do número decimal” e, por sua
vez, quando usamos o código BDC convertemos, na verdade, “cada algarismo do número
decimal” em binário.

O código BCD mais tradicional é o BCD 8421, que usa o sistema de pesos
posicionais 8421 do código binário puro. Como exemplo, velamos como fica o número
decimal 97, quando convertido para os dois casos:

9 7
Conversão Decimal  BCD 8421
1001 0111
97
Conversão Decimal  Binário Puro
0110 0001

Se compararmos os dois resultados de conversão, constatamos grande diferença,


pois: 1001 0111 ≠ 0110 0001 .

Para reconverter (decodificar), diferente do que fazemos na conversão de código


binário puro para decimal, e semelhante ao que fazemos na conversão de código binário
puro para hexadecimal, precisamos primeiro, dividir o binário BCD em grupos de quatro
bits, a partir da direita e só então, podemos converter os código BCD em seus equivalentes
decimais, gerando algarismo por algarismo decimal, simplesmente somando os pesos das
posições de bits onde aparece 1 (veja abaixo a tabela de peso binário). O usual código 8421
BCD e os equivalentes decimais são mostrados na outra tabela.

Tabela de Peso Binário DECIMAL BCD 8421 BINÁRIO

Decimal 23 (8) 22 (4) 21 (2) 20 (1) 0 0000 0000


1
0 0 0 0 0 0001 0001

1 0 0 0 1 2
0010 0010
2 0 0 1 0 3
0011 0011
3 0 0 1 1 4
0100 0100
4 0 1 0 0 5
0101 0101
5 0 1 0 1
6
0110 0110
6 0 1 1 0
7
7 0 1 1 1 0111 0111
8
8 1 0 0 0 1000 1000

9 1 0 0 1 9
1001 1001
10
0001 0000 1010
Observe que cada dígito decimal é 11
0001 0001 1011
representado pelo seu código BCD 8421
equivalente de quatro bits. Convém deixar 12
0001 0010 1100
sempre um espaço entre cada grupo de 4 bits 13
0001 0011 1101
para evitar confusão do formato BCD com o
código binário puro. Este método de 14
0001 0100 1110
15
0001 0101 1111

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 10


representação também se aplica às frações decimais.

Como exemplo, convertemos o número BCD no seu equivalente decimal:

0110 0010 1000,1001 0101 0100 = 628,954

O código BCD simplifica a interface o ser humano e a máquina, mas é menos


eficiente que o código binário puro. Usam-se mais bits para representar um dado número
decimal em BCD que em notação binária pura.

1.4.2 Outros Códigos de 4 bits:


Existem diversos códigos de 4 bits além do código BCD natural (8421), alguns são
códigos BCD diferente do BCD natural, com diferentes correspondências de valores
binários para cada algarismo decimal, como por exemplo o BCD Excesso-3, BCD 2421
(ou BCD Aiken), e BCD 5421. O importante código Gray, que não é um código do tipo
BCD, também é um código de 4 bits muito importante.

BCD Excesso-3 BCD 2 4 2 1


Decimal 8421 ou Código de Código BCD Código
(Natural) Stibitz Aiken 5421 Gray
0 0000 0011 0000 0000 0000
1 0001 0100 0001 0001 0001
2 0010 0101 0010 0010 0011
3 0011 0110 0011 0011 0010
4 0100 0111 0100 0100 0110
5 0101 1000 1011 1000 0111
6 0110 1001 1100 1001 0101
7 0111 1010 1101 1010 0100
8 1000 1011 1110 1011 1100
9 1001 1100 1111 1100 1101

O código BCD Aiken é um código semelhante ao código BCD natural, no entanto


com "pesos" ou "valores" diferentemente distribuídos. No BCD natural, os pesos são: 8-4-
2-1, Aiken distribuição de código é: 2-4-2-1. A
razão para essa codificação é conseguir uma
adequada simetria complementar no conjunto dos 0 0000 9 1111
valores binários que codificam os algarismos 1 0001 8 1110
decimais, de modo que um binário somado ao seu
complemento resulte sempre em 9. Analise a 2 0010
tabela a seguir.
+ 7 1101 9
3 0011 6 1100
O código Aiken é muito útil para subtração
e divisão e ainda é utilizado em relógios digitais, 4 0100 5 1011
calculadoras e outros dispositivos semelhantes.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 11


O código Excesso-3 (XS-3) é também um código binário para codificação de
decimal, conhecido ainda como código de Excesso-N, que segue o mesmo princípio de
conversão de BCD natural, considerando o número decimal algarismo por algarismo, e
convertendo estes para binário, deferindo deste por incrementar 3 unidades ao resultado
binário de cada algarismo decimal.

Para codificarmos, por exemplo, o número decimal 127, nós codificamos


simplesmente cada um dos dígitos decimais resultando em: 0100 0101 1010.

A principal vantagem da codificação XS-3 sobre codificação BCD é que um


número decimal pode ser complementado de 9 (por subtração) tão facilmente como um
número binário pode ser complementado de 1, bastando inverter todos os bits.

A adição em XS-3 trabalha em um algoritmo diferente da adição de codificação


BCD ou da adição da codificação binária pura. Quando adicionamos dois números XS-3, o
resultado não é um número XS-3. Por exemplo, quando você adiciona 1 e 0 em XS-3, a
resposta parece ser de 4 em vez de um. Para corrigir esse problema, quando você terminar
de adicionar cada dígito, você tem que subtrair 3 (binário 0011) se o dígito decimal for
inferior a 10 e adicionar 3 se o número decimal for igual ou superior a 10 (acondicionando
o número).

Já o código Gray é um sistema de código binário onde de um número para outro


apenas um bit varia. Para que ele seja cíclico e mantenha a característica mencionada é
necessário se usar todas as 16 variações de 4 bits. Daí o fato dele não ser tratado como uma
codificação do tipo BCD.

Este sistema de codificação surgiu quando os circuitos lógicos digitais se


realizavam com válvulas termiônicas, para evitar problemas de ruídos e retardos de
comutação e, atualmente, ele tem uma aplicação toda especial com dispositivos
eletromecânicos e ópticos, como os transdutores de posição “encoders”. O disco de leitura
óptica de um encoder absoluto, produz erro de leitura quando vários bits modificavam-se
simultaneamente na variação de uma posição angular para outra posição vizinha. Tal erro
resulta do fato de alguns bits variarem antes de outros. O uso do código Gray garantiu que
qualquer mudança variaria apenas um bit, além do que, encoders rotativos se beneficiam
da natureza cíclica dos códigos Gray, porque os valores da primeira e última posição da
seqüência da seqüência também diferem apenas por um bit.

O código Gray tem muitas aplicações interessantes como por exemplo em


algoritmos genéticos, algoritmo de torre de Hanói, elaboração de mapas de Karnaugh,
correção de erros em comunicação digital, formação de ciclo Hamiltoniano em um
hipercubo, etc.

Algumas vantagens de se usar codificação BCD são:


 Muitos valores não-inteiros, como o decimal de 0,2, por exemplo, têm uma
representação de valor de posições infinita em binário (0,001100110011 ...) mas
tem um valor de posições finito em decimal codificado binário (0,0010).
Conseqüentemente, um sistema de frações decimais baseadas em BCD, evita erros
de representação e de cálculo de tais valores;

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 12


 Escala por um fator de 10 (ou uma potência de 10) é simples, isto é útil quando um
fator de escala decimal é necessário para representar uma quantidade não-inteira
em calculadoras científicas e financeiras.
 O arredondamento em um limite de dígitos decimais é mais simples. Adição e
subtração em decimal não necessita de arredondamento.
 O alinhamento de dois números decimais (por exemplo 1,3 + 27,08) é feito de uma
maneira simples, com deslocamentos exatos.
 A conversão para uma forma caractere ou para exibição (por exemplo, para um
formato baseado em texto, como XML, ou acionar os sinais para um display de sete
segmentos) é um mapeamento simples, por dígitos e pode ser feito em tempo linear.
Conversão de binário puro envolve uma lógica relativamente complexa que
abrange dígitos, e para um número grande nenhum algoritmo de conversão de
tempo linear é conhecido.

Desvantagens:
 O padrão BCD requer quatro bits por dígito decimal, o que significa a necessidade
de cerca de 20% a mais de espaço de armazenamento do que uma codificação
binária pura. Quando acondicionados de modo que três dígitos decimais são
codificados em dez bits, a sobre-necessidade de armazenamento é reduzida para
cerca de 0,34%, à custa de uma codificação que se encontra em desarranjo com os
limites padronizados de bytes de 8-bits comuns nos hardwares existente, resultando
em implementações mais lentas nesses sistemas .
 Algumas operações são mais complexas de se implementar. Circuitos somadores
lógicos, por exemplo, exigem lógica extra, algo em torno de 20% a mais de
circuito, se comparado ao emprego do binário puro, para levá-los a envolver e a
gerar o bit de carry em tempo. A multiplicação, por sua vez, requer o uso de
algoritmos que são um pouco mais complexos do que a desloca, carrega e soma (é
necessária uma multiplicação binária que exige deslocamentos binários e adições,
que são feitas por dígitos ou por grupo de dígitos)
 Implementações práticas existentes de operações de BCD são tipicamente mais
lentas do que as operações em representações binárias, especialmente em sistemas
embarcados, devido ao suporte limitado dos processadores para as operações
nativas em BCD.

1.5 Organização de Dados:

Na matemática pura um número binário qualquer pode assumir um número


arbitrário de bits. Computadores, por outro lado, geralmente trabalham com alguns
grupamentos de tamanho de números específicos de bits. Coleções comuns são bits
simples, grupos de quatro bits (chamados Nibbles), grupos de oito bits (chamados Bytes),
grupos de 16 bits (chamados Words) e outros.

Os tamanhos dos grupamentos não são arbitrários. Há uma boa razão para esses
valores particulares de tamanho de grupamento. Esta seção descreverá os grupos de bits
mais comumente utilizados nos chips dos microcontroladores e microprocessadores.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 13


1.5.1 Bits

A menor "unidade" de dado em um computador binário é um bit sozinho. Uma vez


que um único bit é capaz de representar apenas dois diferentes valores (geralmente zero ou
um) você pode ter a impressão de que há um número bem pequeno de itens que você possa
representar com um único bit. Não é verdade! Há um infinito número de itens que você
pode representar com um simples bit.

Com um único bit, você pode representar quaisquer dois itens distintos. Exemplos
incluem "zero ou um", "verdadeiro ou falso", "ligado ou desligado", "macho ou fêmea",
"certo ou errado", "sim ou não", etc. Contudo, você não está limitado a representar tipos de
dados binários (isto é, aqueles objetos que tem apenas dois valores distintos).

Você poderia utilizar um único bit para representar os números 723 e 1245. Ou
talvez 6254 e 5. Você poderia também utilizar um único bit para representar as cores
vermelha e azul. Poderia até mesmo representar dois objetos não relacionados com um
único bit. Por exemplo, você poderia representar a cor vermelha e o número 3256 com um
único bit. Você pode representar quaisquer dois diferentes valores com um simples bit.
Contudo, pode representar apenas dois valores diferentes com um bit.

Para “confundir” ainda mais, diferentes bits podem representar diferentes coisas.
Por exemplo, um bit poderia ser utilizado para representar os valores zero e um, enquanto
um bit adjacente poderia ser utilizado para representar os valores verdadeiro e falso. Como
você pode dizer apenas olhando estes bits? A resposta, é claro, é que você não pode. Mas
isto ilustra toda a idéia por trás das estruturas de dados em computadores: dados são o que
você define que eles sejam.

Se você usa um bit para representar uma variável booleana (verdadeiro / falso)
então aquele bit (pela sua definição) representa verdadeiro ou falso. Para o bit ter qualquer
significado verdadeiro, você deve ser consistente. Isto é, se você está utilizando um bit
para representar verdadeiro ou falso em um determinado ponto de um programa, você não
poderá (ou melhor, não deverá) utilizar o valor verdadeiro / falso armazenado naquele bit
para depois representar vermelho ou azul, em outro ponto do programa.

Uma vez que muitos itens que você tentará modelar necessitarão de mais de dois
valores diferentes, valores de simples bits não serão o mais popular tipo de dado que você
utilizará. Contudo, já que todo o resto consiste de grupos de bits, os bits desempenharão
uma importante função em seus programas. É claro, há muitos tipos de dados que
requerem dois valores distintos, então parecerá que bits sejam muito importantes nestes
casos. Contudo, em breve veremos que bits individuais são difíceis de manipular, então
freqüentemente utilizaremos outros tipos de dados para representar valores booleanos.

1.5.2 Nibbles

Um Nibble é uma coleção de quatro bits. Ele não seria uma estrutura de dados de
especial interesse exceto por dois itens: os números representados em código BCD (Binary
Code Decimal) e números em hexadecimais. Tomam-se grupos de quatro bits para
representar um único dígito em código BCD ou um algarismo em hexadecimal. Com um
Nibble, podemos representar até 16 valores distintos. No caso de números decimais, os

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 14


valores 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F são representados com quatro bits. BCD
utiliza dez dígitos diferentes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) e requer quatro bits. De fato,
quaisquer 16 valores distintos podem ser representados com um Nibble, no entanto os
dígitos em hexadecimal e em código BCD são os itens primários que nós podemos
representar com um único Nibble.

1.5.3 Byte

Sem dúvida, a mais importante estrutura de dados utilizada pelos


microcontroladores e microprocessadores é o Byte. Um Byte consiste de oito bits e é o
menor item de dado endereçável na maioria dos microcontroladores e microprocessadores.
As locações da memória principal e os endereços de E/S são todos dados em Bytes. Isto
significa que o menor item que pode ser individualmente acessado por um programa de um
sistema com microprocessador / microcontrolador é um valor de 8 bits. Para acessar algo
menor requer que você leia o Byte que contém o dado e remova os bits indesejados. Os bits
em um Byte são normalmente numerados de zero a sete utilizando a convenção mostrada
abaixo:

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0


27 26 25 24 23 22 21 20
X7 X6 X5 X4 X3 X2 X1 X0

Bit 0 é o bit de mais baixa ordem ou bit menos significativo, e o bit 7 é o bit de
mais alta ordem ou mais significativo do Byte. Referiremos a todos os outros pelos seus
números.

Note que um Byte também contém exatamente dois Nibbles:

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0


27 26 25 24 23 22 21 20
X3 X2 X1 X0 Y3 Y2 Y1 Y0

Os bits Y0 até Y3 compreendem o Nibble de baixa ordem (menos significativo), os


bits X0 até X3 formam o Nibble de alta ordem (mais significativo). Como um Byte contém
exatamente dois Nibbles, valores de Byte requerem dois dígitos em hexadecimal.

Uma vez que um Byte contém oito bits, ele pode representar 28, ou 256 valores
diferentes. Geralmente, utilizaremos um Byte para representar valores numéricos no
intervalo de 0 a 255, ou então números num sistema sinalizado no intervalo -128 a 127,
códigos de caracteres ASCII / IBM e outros tipos de dados especiais que não requerem
mais do que 256 valores diferentes. Muitos tipos de dados têm bem menos do que 256
itens então oito bits geralmente são suficientes.

Já que a maioria dos microcontroladores e microprocessadores são máquinas


endereçáveis por Bytes, é mais eficiente manipular todo um Byte do que um bit individual
ou um Nibble. Por esta razão, muitos programadores utilizam um Byte inteiro para
representar tipos de dados que não requerem mais do que 256 itens, mesmo que menos de
8 bits fossem suficientes. Por exemplo, freqüentemente representamos valores booleanos
verdadeiro e falso por 00000001 e 00000000 (respectivamente).

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 15


Provavelmente o mais importante uso para um Byte é guardar o código de um
caractere. Caracteres digitados no teclado, exibidos na tela e impressos na impressora são
na verdade referidos dentro dos sistemas de processamento digital por valores numéricos.
Para permitir a comunicação com o resto do mundo o IBM PC usa uma variante do
conjunto de caracteres ASCII. Há 128 códigos definidos no conjunto de caracteres padrão
ASCII / IBM. Este código utiliza ainda os outros 128 valores restantes para códigos de
caracteres estendidos incluindo caracteres Europeus, símbolos gráficos, letras Gregas e
alguns símbolos matemáticos, etc.

1.5.4 Word

Uma Word (palavra) é um grupo de 16 bits. Numeraremos os bits em uma Word


começando do zero e indo até o quinze. A numeração dos bits aparece abaixo:

bit bit bit bit bit bit bit bit bit bit bit bit bit bit bit bit
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
X15 X14 X13 X12 X11 X10 X9 X8 X7 X6 X5 X4 X3 X2 X1 X0

Semelhante ao que acontece como Byte, o bit 0 é o de baixa ordem (menos


significativo) e o bit 15 é o de alta ordem (mais significativo). Quando referenciamos os
outros bits em uma Word usamos o número de suas respectivas posições.

bit bit bit bit bit bit bit bit bit bit bit bit bit bit bit bit
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
X7 X6 X5 X4 X3 X2 X1 X0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

Note que uma Word contém exatamente dois Bytes. Os bits X0 a X7 formam o Byte
de baixa ordem, os bits Y0 a Y7 formam o Byte de alta ordem:

Naturalmente, uma Word pode ser quebrada em quatro Nibbles como mostrado
abaixo:

bit bit bit bit bit bit bit bit bit bit bit bit bit bit bit bit
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
P3 P2 P1 P0 Q3 Q2 Q1 Q0 R3 R2 R1 R0 S3 S2 S1 S0

O Nibble zero (S0 até S3) é o Nibble de baixa ordem (menos significativo) na Word
e o Nibble três (P0 até P3) é o de alta ordem (mais significativo). Os outros dois Nibbles são
o Nibble um (R0 até R3) e Nibble dois (Q0 até Q3).

Com 16 bits, você pode representar 216 (65536) valores ou itens diferentes. Esses
podem ser valores no intervalo 0 a 65535, ou de -32768. até +32767, para um sistema
sinalizado ou qualquer outro tipo de dado com não mais do que 65536 valores ou itens. Os
três maiores usos para Words são valores inteiros, deslocamentos e valores de segmentos.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 16


Words podem representar valores inteiros no intervalo de 0 a 65535 ou de -32768 a
32767 em um sistema sinalizado. Valores numéricos sem sinal são representados por
valores binários correspondendo aos bits na Word. Valores numéricos com sinal usam a
forma de complemento de dois para valores numéricos. Valores de segmentos, os quais são
sempre de 16 bits de comprimento, constituem o endereço do parágrafo de um segmento
de código, dado, extra ou pilha na memória.

NOTA: O termo Word (palavra) é utilizado também, de uma forma geral, para
designar a um grupamento de n bits qualquer (depende do processador ou do
sistema de código usado). Por exemplo, os primeiros microprocessadores
eram de quatro bits e a esse grupamento de quatro bits também chamamos
de palavra binária, O Código ASCII, como vimos, representa símbolos
alfanuméricos, podendo representá-los em grupamentos de sete bits ou, se
estendido, de oito bits – a ambos esses grupamentos podemos também, de
forma genérica, chamarmos de palavra binária.

1.5.5 Double Word

Uma Double Word é exatamente o que seu nome indica, um par de Words. Então,
uma quantidade de Double Word é de 32 bits de comprimento como mostrado abaixo:

31 23 15 7 0

Naturalmente, esta Double Word pode ser dividida em duas Words, sendo uma de
alta e outra de baixa ordem. Pode também ser dividida em quatro Bytes ou oito Nibbles:

Double Words podem representar todo tipo de diferentes coisas. Primeiro e


principalmente é usada para guardar endereços segmentados. Um outro item comum
representado com um Double Word é um valor inteiro de 32 bits (o qual permite números
sem sinal em um intervalo de 0 até 4.294.967.295 ou números com sinal em um intervalo
de -2.147.483.648 até 2.147.483.647).

Valores de ponto flutuante de 32 bits também cabem dentro de uma Double Word.
Muitas das vezes, usaremos Double Words para guardar endereços segmentados.

OBS:

Dado  Elementos distintos de uma informação;

Informação  Coleção de dados representada de forma compreensível ao ser


humano.

Técnicas e Subsistemas Digitais André Luis Lenz Maio/2010 17

You might also like