Professional Documents
Culture Documents
1. Sistemas de Numeração:
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.
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
Ou seja:
100 + 20 + 3 + 0.4 + 0.05 + 0.006 = 123,456 10
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:
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
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:
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
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.
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.
Uma vez realizada esta operação, assinalar o valor “1” na posição 210, como sendo
o algarismo mais significativo do número convertido;
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.
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.
Uma vez realizada esta operação, assinalar o valor “1” na posição 27, e prosseguir
para a próxima potencia de dois.
Assim, para o número decimal 1257, temos por fim o seguinte resultado:
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:
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:
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.
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.
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.
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.
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.
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
• Todo valor binário termina com a letra "b" – Ex: 1010 0110b;
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
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
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
5237 16
MENOS 5 327 16
SIGNIFICATIVO
7 20 16
4 1 16
1 0
MAIS SIGNIFICATIVO
3 15 12
3 . 256 15 . 16 12 . 1
768 240 12 1020 10
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
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
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.
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.
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
1.5.3 Byte
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.
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.
1.5.4 Word
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
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.
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.
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:
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: