Sistemas de Numeração O número é um conceito abstrato que representa a ideia de quantidade. Pode ter uma representação simbólica, como no sistema romano, ou ter um peso de acordo com a posição que ocupa, como no sistema árabe, que usamos normalmente. A necessidade de contar e registar quantidades de objetos foi sentida pelo homem desde os primórdios da civilização. Um sistema de numeração é o conjunto de símbolos utilizados para a representação de quantidades e as regras que definem a forma de representação. O sistema de numeração mais simples é o de base unária ou seja cada objeto é representado por um símbolo. O termo símbolo designa um elemento representativo que está no lugar de algo que é representado por um objeto e determinado pela quantidade ou pela qualidade. Exemplos: •
5 objetos podem ser representados por /////.
•
Associar quantidades de 10 objetos e usar o símbolo * para as representar. Quantidades de 100 podem ser representadas por + e assim sucessivamente.
•
Assim, 324 objetos podem ser representados por +++**////.
Desde que se começou a registar informações sobre quantidades, foram criados diversos métodos de representar as quantidades. O método ao qual estamos familiarizados usa um sistema de numeração posicional. Isso significa que o valor de cada símbolo é determinado de acordo com a sua posição no número. Um sistema de numeração é determinado fundamentalmente pela BASE, que indica a quantidade de símbolos e o valor de cada símbolo. Do ponto de vista numérico, o homem usa o sistema decimal. Por exemplo, no sistema decimal (base 10), no número 125 o algarismo 1 representa 100 (uma centena ou 102), o 2 representa 20 (duas dezenas ou 2x101) e o 5 representa o 5 (5 unidades ou 5x100). Assim, na nossa notação: 125 = 1x102 + 2x101 + 5x100 A base de um sistema é a quantidade de algarismos disponível na representação. Hoje a base 10 é a mais utilizada, embora não seja a única. No comércio pedimos uma dúzia de rosas (base 12) e também marcamos o tempo em minutos e segundos (base 60).
Os computadores utilizam a base 2 (sistema binário) e os programadores, por facilidade, usam em geral uma base que seja uma potência de 2, tal como 24 (base 16 ou sistema hexadecimal) ou eventualmente 23 (base 8 ou sistema octal).
Significância Posicional Um número é representado por uma sequência de dígitos onde a posição de cada dígito tem um determinado peso associado. Por exemplo, o valor N de um número decimal de 4 dígitos A3A2A1A0 é dado por:
N = A3 ×10 3 + A2 ×10 2 + A1 × 101 + A0 × 10 0 Cada dígito Ai tem um peso 10i. Sendo assim, o valor 6851 pode ser escrito da seguinte maneira:
6851 = 6 × 10 3 + 8 ×10 2 + 5 ×101 + 1× 10 0
O ponto decimal é utilizado para permitir, na representação do número, potências positivas e negativas de 10. O número A1A0,A-1A-2 tem o valor:
N = A1 × 101 + A0 × 10 0 + A−1 × 10 −1 + A−2 × 10 −2
Por exemplo, o número 34,85 pode ser representado por:
N = 3 ×101 + 4 ×10 0 + 8 ×10 −1 + 5 ×10 −2 Num sistema de numeração posicional genérico, a posição de cada dígito tem um peso associado Bi onde B é a base do sistema de numeração ou radical. O formato geral de um número neste sistema é: Ap-1Ap-2 … A1A0A-1A-2 … A-n em que existem p dígitos à esquerda do ponto, e n dígitos à sua direita. A fórmula geral de significância posicional num sistema de base B é: n
N = ∑ Ai B i i =0
Exemplo: representar o número decimal 845 usando a fórmula geral de significância posicional.
n
N = ∑ Ai B i = 8 × 10 2 + 4 × 101 + 5 × 10 0 i =0
O dígito mais à esquerda designa-se por dígito mais significativo (MSD – Most Significant Digit), enquanto que o dígito mais à direita é designado por dígito menos significativo (LSD – Least Significant Digit).
Sistema de numeração Decimal Este é o sistema mais utilizado no dia a dia das pessoas, tendo sido baseado no facto do ser humano ter cinco dedos em cada mão, num total de dez dedos. Utiliza dez algarismos ou dígitos (0,1,2,3,4,5,6,7,8,9) tendo por base do sistema o número 10. A posição de cada dígito no número diz-nos que grandeza representa. Se por exemplo pretendermos representar a grandeza 53, usamos o dígito 5 para representar a quantidade cinquenta e o algarismo 3 para representar a quantidade três. Assim, a posição de cada dígito num número decimal indica a amplitude da quantidade representada e é designada por peso. Os pesos são potências de 10 e aumentam da direita para a esquerda, iniciando-se em 100=1. O número decimal 286 pode representar-se numa expressão polinomial, como se indica: 200 = 2 x 102 80 = 8 x 101 6 = 6 x 100 286 = 2 x 102 + 8 x 101 + 6 x 100 = N(10) Um número pode ser então representado por uma sequência de dígitos, representando a parte inteira do número, seguindo-se a vírgula e uma outra sequência de dígitos representando a parte fracionária do número. (N) = di… d3d2d1d0,d-1d-2d-3… d-k Para a parte inteira, di (que é o número mais à esquerda) é o dígito mais significativo (MSD), porque é o que tem mais peso na parte inteira do número, e o d0 (que é o número mais á direita) é o dígito menos significativo (LSD), porque é o que tem menos peso na parte inteira do número. Para a parte fracionária, d-1 (que é o número mais á esquerda) é o dígito mais significativo (MSD), porque é o que tem mais peso na parte fracionária do número, e o
d-k (que é o número mais à direita) é o dígito menos significativo (LSD), porque é o que tem menos peso na parte fracionária do número. 4137,65(10) = 4 x 103 + 1 x 102 + 3 x101 + 7x100 + 6x10-1 + 5x 10-2 O dígito 4 tem o peso 1000, o dígito 1 o peso 100, o 3 o peso 10, o 7 o peso 1, o dígito 6 o peso 0,1 e o 5 o peso 0,01. 10000 104
1000 103
100 102
10 101
1 100
0,1 10-1
0,01 10-2
0,001 10-3
Tabela 1 – Potências de Dez (10)
Sistema de numeração Binário Tal como no sistema decimal, trata-se de um sistema pesado, onde cada dígito comparticipa na formação do número com um peso, determinado pela posição que ocupa no número. A diferença é que agora apenas existem dois dígitos: 0 e 1, tendo por base do sistema o número 2. Os dígitos nos números binários são chamados bits (binary digits). Ao agrupamento de oito bits chama-se byte, sendo o conjunto de 4 bits apelidado de meio byte ou nibble. Para melhor compreensão da formação dos números neste sistema vejamos previamente como se efetua a contagem em decimal. Começa-se em 0 e conta-se de forma crescente até 9; depois recomeça-se, agora com um 1 à esquerda, e obtém-se 10, 11, 12 … até 99. Esgotadas todas as combinações com dois dígitos, torna-se necessário um terceiro, para se efetuar a contagem de 100 até 999. Uma situação análoga acontece no sistema binário. Inicia-se a contagem 0, 1. Como se esgotaram os dois dígitos (0 e 1), inclui-se um segundo dígito (à esquerda) e continua-se a contar 10, 11. Como se esgotaram as combinações possíveis com dois dígitos é necessário um terceiro dígito. A contagem continua 100, 101, 110 e 111. Necessitaríamos agora de um quarto dígito para continuar a contagem e assim sucessivamente. 0 0 0 1 1 1 10 10 11 11 100 101 110 111
Genericamente, com n bits podemos contar de zero até ao maior valor dado por: 2n-1 Na tabela estão representados os números até quinze. Número
Decimal
Binário
Zero
0
0000
Um
1
0001
Dois
2
0010
Três
3
0011
Quatro
4
0100
Cinco
5
0101
Seis
6
0110
Sete
7
0111
Oito
8
1000
Nove
9
1001
Dez
10
1010
Onze
11
1011
Doze
12
1100
Treze
13
1101
Catorze
14
1110
Quinze
15
1111
O número 1111, em base 2 (binário), que deve ser escrito indicando a base imediatamente á frente do número 11112, em valor decimal (base 10) corresponde a 1510.
Sistema de numeração Octal O sistema é designado por octal porque utiliza oito algarismos ou dígitos: 0, 1, 2, 3, 4, 5, 6 e 7. Para se contar além do 7, inicia-se uma nova coluna e obtém-se sucessivamente 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, … Para distinguir estes números dos decimais representa-se as grandezas do sistema octal afetadas do índice oito. Exemplo: 168.
Na tabela estão representados os números até dezasseis. Número
Decimal
Octal
Zero
0
0
Um
1
1
Dois
2
2
Três
3
3
Quatro
4
4
Cinco
5
5
Seis
6
6
Sete
7
7
Oito
8
10
Nove
9
11
Dez
10
12
Onze
11
13
Doze
12
14
Treze
13
15
Catorze
14
16
Quinze
15
17
Dezasseis
16
20
O número 17, em base 8 (octal), que deve ser escrito indicando a base imediatamente á frente do número 178, em valor decimal (base 10) corresponde a 1510. Este sistema pode ser obtido a partir do binário por associação de conjunto de bits, sendo neste caso associados 3 bits. Ao associar 3 bits, permite 23 valores distintos, ou seja, dígitos de 0 a 7.
Sistema de numeração Hexadecimal O sistema hexadecimal é constituído por 16 símbolos. Como um grande número de sistemas digitais tratam a informação em agrupamentos de bits em números múltiplos de 4, tornam este sistema de grande utilidade, uma vez que cada um dos dígitos que o constitui pode ser representado por um número binário de 4 bits. Como apenas existem 10 algarismos, os restantes símbolos deste sistema são as 6 primeiras letras do alfabeto: A, B, C, D, E e F.
O uso de letras para representar números pode aparecer estranho à primeira vista, mas note-se que a representação de um número é apenas uma sequência de símbolos. É mais fácil representar grandezas em hexadecimal que em binário, o que privilegia este sistema na representação de números e códigos digitais. Na tabela estão representados os números até dezasseis. Número
Decimal
Binári
Hexadecimal
Zero
0
0000 o
0
Um
1
0001
1
Dois
2
0010
2
Três
3
0011
3
Quatro
4
0100
4
Cinco
5
0101
5
Seis
6
0110
6
Sete
7
0111
7
Oito
8
1000
8
Nove
9
1001
9
Dez
10
1010
A
Onze
11
1011
B
Doze
12
1100
C
Treze
13
1101
D
Catorze
14
1110
E
Quinze
15
1111
F
Dezasseis
16
10000
10
O número F, em base 16 (hexadecimal), que deve ser escrito indicando a base imediatamente á frente do número F16, em valor decimal (base 10) corresponde a 1510. Como se conta em hexadecimal depois de se alcançar F? Do mesmo modo, inicia-se uma nova coluna a começar em: 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 2C, 2D, 2E, 2F, 30, 31, …
Com dois dígitos em hexadecimal podemos representar FF16, que corresponde ao decimal 25510, pois:
FF16 = F × 161 + F × 16 0 = 15 ×161 + 15 ×16 0 = 15 ×16 + 15 × 1 = 240 + 15 = 25510 Este sistema pode ser obtido a partir do binário por associação de conjunto de bits, sendo neste caso associados 4 bits. Ao associar 4 bits, permite 24 valores distintos, ou seja, dígitos de 0 a F. A tabela seguinte mostra os números binários de 0 a 1111 e os seus equivalentes decimais, octais e hexadecimais. Binário
Decimal
Octal
3 bits
Hexadecimal
4 bits
0
0
0
000
0
0000
1
1
1
001
1
0001
10
2
2
010
2
0010
11
3
3
011
3
0011
100
4
4
100
4
0100
101
5
5
101
5
0101
110
6
6
110
6
0110
111
7
7
111
7
0111
1000
8
10
----
8
1000
1001
9
11
----
9
1001
1010
10
12
----
A
1010
1011
11
13
----
B
1011
1100
12
14
----
C
1100
1101
13
15
----
D
1101
1110
14
16
----
E
1110
1111
15
17
----
F
1111
Conversão de números em qualquer base para decimal Para a conversão de números representados em qualquer base (binário, octal e hexadecimal), para a base decimal, utiliza-se a fórmula geral de significância posicional.
Conversão Binário – Decimal Para exprimirmos no seu equivalente decimal uma determinada grandeza binária, basta multiplicar cada bit pelo seu peso e adicionar os respetivos produtos. O bit da direita é o menos significativo (LSD) e tem um peso de 2 0=1 para os números inteiros, aumentando o peso da direita para a esquerda, em potências de dois por cada bit. Exemplo 1: Converter o número binário 1101012 em decimal.
1101012 = 1× 2 5 + 1× 2 4 + 0 × 2 3 + 1× 2 2 + 0 × 21 + 1× 2 0 = = 1× 32 + 1×16 + 0 × 8 + 1× 4 + 0 × 2 + 1× 1 = 32 + 16 + 0 + 4 + 0 + 1 = 5310 Em relação ao seu peso:
Para os números fracionários a representação é ainda a mesma, tendo agora os bits à direita da vírgula, pesos que são potências de 2 de expoente negativo. Exemplo 2: Converter o número binário fracionário 101,1012 em decimal.
101,1012 = 1× 2 2 + 0 × 21 + 1× 2 0 + 1× 2 −1 + 0 × 2 −2 + 1× 2 −3 = = 1× 4 + 0 × 2 + 1×1 + 1× 0,5 + 0 × 0,25 + 1× 0,125 = 4 + 0 + 1 + 0,5 + 0 + 0,125 = 5,62510
Em relação ao seu peso:
Conversão Octal – Decimal Tal como na conversão binário - decimal, para exprimirmos no seu equivalente decimal uma determinada grandeza octal, basta multiplicar cada dígito pelo seu peso e adicionar os respetivos produtos. O dígito da direita é o menos significativo (LSD) e tem um peso de 80=1 para os números inteiros, aumentando o peso da direita para a esquerda. Exemplo 1: Converter o número octal 12348 em decimal.
1234 8 = 1× 83 + 2 × 8 2 + 3 × 81 + 4 × 8 0 = 1× 512 + 2 × 64 + 3 × 8 + 4 ×1 = = 512 + 128 + 24 + 4 = 66810 Em relação ao seu peso:
Para os números fracionários a representação é ainda a mesma, tendo agora os dígitos à direita da vírgula, pesos que são potências de 8 de expoente negativo.
Exemplo 2: Converter o número octal fracionário 1234,568 em decimal.
1234,56 8 = 1× 83 + 2 × 8 2 + 3 × 81 + 4 × 80 + 5 × 8 −1 + 6 × 8 −2 = = 1× 512 + 2 × 64 + 3 × 8 + 4 ×1 + 5 × 0,125 + 6 × 0,015625 = = 512 + 128 + 24 + 4 + 0,625 + 0,09375 = 668,7187510 Em relação ao seu peso:
Conversão Hexadecimal – Decimal Para exprimirmos no seu equivalente decimal uma determinada grandeza hexadecimal, basta multiplicar cada dígito pelo seu peso e adicionar os respetivos produtos. O dígito da direita é o menos significativo (LSD) e tem um peso de 16 0=1 para os números inteiros, aumentando o peso da direita para a esquerda. Exemplo 1: Converter o número hexadecimal E1416 em decimal. 2 1 0 E1415 = E × 16 + 1× 16 + 4 × 16 = 14 × 256 + 1× 16 + 4 ×1 = =14
= 3584 + 16 + 4 = 360410 Em relação ao seu peso:
Para os números fracionários a representação é ainda a mesma, tendo agora os dígitos à direita da vírgula, pesos que são potências de 16 de expoente negativo.
Exemplo 2: Converter o número hexadecimal fracionário E14,5616 em decimal. 2 1 0 −1 −2 E14,56 8 = E × 16 + 1 × 16 + 4 × 16 + 5 × 16 + 6 × 16 = =14
= 14 × 256 + 1 × 16 + 4 × 1 + 5 × 0,0625 + 6 × 0,00390625 = = 3584 + 16 + 4 + 0,3125 + 0,0234375 = 3604,335937510 Em relação ao seu peso:
Conversão de números em decimal para outras bases de numeração
Para a conversão de números em decimal para outras bases de numeração utiliza-se o método das divisões sucessivas. Este método consiste na realização de uma série de divisões inteiras até que o quociente seja menor que o divisor. O divisor usado é o valor da base de destino e os restos das divisões inteiras é a sequência de algarismos da base de destino.
Conversão Decimal – Binário 1 – Números inteiros São efetuadas divisões sucessivas por 2 e o equivalente encontrado será formado pelo último quociente (MSD) e pelos restos escritos pela ordem contrária àquela de que foram obtidos. O primeiro resto encontrado será o LSD. Exemplos: 1 - Converter o número 4710 em binário:
47 2 07 23 2 1 03 11 2 1 1 5 2 1 2 2 Sentido de 0 1 formação
4710=1011112 2 - Converter o número 13710 em binário:
137 2 17 68 2 1 08 34 2 0 14 17 0 1
2 8 0
2 4 0
Sentido de formação
13710=10001001 2
2 2 2 0 1
2 – Números fracionários As frações decimais podem converter-se multiplicações sucessivas por 2.
para
binário
pelo
método
das
Para se converter, por exemplo, a fração decimal 0,2175 para binário, multiplica-se 0,2175 por 2, multiplicando-se seguidamente cada parte fracionária restante ainda por 2, até que o resultado seja 0, ou até o número de casas decimais pretendidas. Os dígitos obtidos são as partes inteiras dos produtos obtidos, sendo o 1º o MSB e o último o LSD. Exemplo 1: Converter para binário o número 0,317510: 1ª etapa 0,3175 x 2 = 0,635 0 MSB 2ª etapa 0,635 x 2 = 1,270 1 3ª etapa 0,270 x 2 = 0,54 0 4ª etapa
0,54 x 2 = 1,02 1 LSB 0,317510=0,01012
Exemplo 2: Converter para binário o número 24,317510: 1º Converter a parte inteira:
24 2 04 12 2 0 0 6 0 LSD
2 3 2 1 1 ← MSD
2410=110002 2º Converter a parte fracionária: 1ª etapa 0,3175 x 2 = 0,635 0 MSB 2ª etapa 0,635 x 2 = 1,270 1 3ª etapa 0,270 x 2 = 0,54 0
4ª etapa
0,54 x 2 = 1,02 1 LSB 0,317510=0,01012
3º Juntar os dois resultados: 24,317510=11000,0101 2
Conversão Decimal – OCTAL Neste método também se utilizam as divisões sucessivas, mas neste caso divisões por 8 para a parte inteira e multiplicações sucessivas por 8 para a parte fracionária. Exemplo 1: Converter o número decimal 137510 para octal:
1375 8 57 171 8 15 11 21 8 7 3 5 2 LSD ← MSD 137510=25378 Exemplo 2: Converter o número decimal 1987,6543 10 para octal: 1º Converter a parte inteira:
1987 8 38 248 67 08 3 0 LSD ←
8 31 7
8 3 MSD
198710=37038
2º Converter a parte fracionária: 1ª etapa
0,6543 x 8 = 5,2344 5 MSB
2ª etapa
0,2344 x 8 = 1,8752
1 3ª etapa
0,8752 x 8 = 7,0016 7
4ª etapa
0,0016 x 8 = 0,0128 0 LSB 0,654310=0,51708
3º Juntar os dois resultados: 1987,6543 10=3703,51708
Conversão Decimal – Hexadecimal Este método é análogo aos descritos anteriormente. Também se utilizam divisões sucessivas, mas neste caso divisões por 16 para a parte inteira e multiplicações sucessivas por 16 para a parte fracionária. Exemplo 1: Converter o número decimal 137510 para hexadecimal:
1375 16 09 85 16 15 5 5 { F
LSD ← MSD 137510=55F16 Exemplo 2: Converter o número decimal 1987,6543 10 para hexadecimal:
1º Converter a parte inteira:
1987 16 038 124 16 67 12 7 { C 3 LSD ← MSD 198710=7C316 2º Converter a parte fracionária: 1ª etapa
0,6543 x 16 = 10,4688 10 = A MSB
2ª etapa
0,4688 x 16 = 7,5008 7
3ª etapa
0,5008 x 16 = 8,0128 8
4ª etapa
0,0128 x 16 = 0,2048 0 LSB 0,654310=0,A78016
3º Juntar os dois resultados: 1987,6543 10=7C3,A78016
A importância da Base Binária O matemático inglês George Boole (1815-1864) publicou em 1854 “As leis do pensamento”, obra em que criou uma forma de armazenar e processar informações utilizando o código binário. Desta maneira, os bits não serviriam apenas para representar números, mas para qualquer coisa que precise ser informada a um computador. Uma letra, uma vírgula, informações sobre datas, horários, programas de computador, tudo pode ser representado por sequências de algarismos 0 e 1. Isto quer dizer que o código binário pode ser utilizado para representar qualquer tipo de informação. Cada informação pode ser transformada num código binário e interpretada pelo computador. A lógica binária (ou lógica booleana, em homenagem a George Boole) faz o uso dos algarismos 0 e 1, associados aos conceitos de falso e verdadeiro, para desenvolver um conjunto de operações lógicas, como “e”, “ou”, “negação”, entre outras. As operações lógicas são importantes para que os computadores tomem decisões, como: “Se o utilizador clicar um botão, mostre o resultado da operação de soma no monitor, se não clicar mostre uma mensagem de ajuda”, “Se o resultado da operação realizada for maior que 50, retorne o resultado, senão espere o próximo valor”, “Se o utilizador digitar uma tecla, mostre a letra correspondente no monitor, se não digitar não faça nada”.
Porque os computadores usam o código Binário Outro matemático inglês, Charles Babbage (1792-1871), projetou o “Calculador Analítico”, aparelho muito próximo de um computador atual, porém era uma máquina totalmente mecânica. Ela era composta por uma memória, um engenho central, engrenagens, alavancas e dispositivos para entrada e saída de dados, que nada mais são do que informação. A partir da década de 30, foram feitas várias tentativas de substituir as partes mecânicas dos equipamentos por partes elétricas, com o uso dos relés, equipamentos elétricos que funcionam como chaves, com posições “aberta” (sem corrente, ou seja, bit 0) ou “fechada” (com corrente, ou seja, bit 1). A vantagem de um computador
elétrico é a sua velocidade, muito superior à do computador mecânico. Isto ocorre porque a corrente elétrica é muito mais rápida do que qualquer engrenagem mecânica. Quando os computadores passaram a funcionar através da energia elétrica, o código binário foi a melhor forma encontrada para representar os sinais elétricos através de algarismos. Isto porque há dois estados possíveis para os componentes elétricos: com corrente elétrica ou sem corrente. Desta forma, o bit 0 é representado pela falta da corrente elétrica, e o bit 1 pela presença da corrente. Pode-se entender o código binário comparando os bits a interruptores elétricos, em que 0 indica “desligado” e 1 “ligado”, como representado na seguinte figura. Um byte (sequência de oito bits) pode então ser imaginado como uma sequência de oito interruptores, sendo que as posições em que se encontram os interruptores ligados e desligados indica qual o número ou letra representados.
Figura 1: representação dos Bits
Como o código binário é a representação utilizada pelos computadores, toda informação, seja um número ou uma letra, precisa de ser representada através de um código composto de uma sequência de 0 e 1. São as diferentes combinações entre os bits que são usadas para criar uma mensagem que a máquina (o computador, a calculadora, o relógio, etc) possa entender. Como já foi visto, o número nove é representado pelo sistema binário por 00001001. Observe que, para qualquer sistema de numeração zeros à esquerda não possuem valor algum. A representação 00001001 é vista pelo computador como uma lâmpada acesa, seguida de duas apagadas, depois outra acesa e por fim quatro apagadas. Os computadores modernos (digitais) efetuam cálculos (operações aritméticas e lógicas) com precisão e rapidez, através do uso da lógica binária, desenvolvida por Boole no século XIX. Estas operações são realizadas pelos circuitos integrados, ou chips, existentes nos computadores. Eles nada mais são que componentes eletrónicos que realizam operações lógicas.
Operações Aritméticas A adição e a subtração de números que usam bases não decimais seguem regras muito semelhantes às utilizadas para o sistema decimal. Por esse motivo, vamos começar por rever o processo que utilizamos para as operações em decimal.
Adição e Subtração em decimal Considere o seguinte exemplo:
3047 + 7869 10916 Esta soma em decimal é feita de acordo com o que está representado na figura seguinte:
1011 3047 + 7869 10916 Repare-se que, nesta figura, foi colocado sobre os números um resultado intermédio da operação. Na soma, a que estamos habituados a referirmo-nos a este resultado intermédio como “e vai um”, ou seja, estamos a referir um resultado que não é possível representar no dígito atual e que por, esse motivo, tem que ser combinado com o dígito mais significativo (à sua esquerda) no passo seguinte da operação. Este “bit adicional” é referido em inglês como o bit de carry. Sempre que esta situação acontece, é necessário somar o valor em acréscimo ao bit mais significativo seguinte. Deve também notar-se que o resultado desta soma de dois números de 4 bits foi um número de 5 bits, o que significa que, por vezes, são necessários bits adicionais para representar o resultado de uma operação. Na figura seguinte está representada a operação de subtração de números decimais.
11 8027 - 3864 4163
O processo é semelhante à soma mas, neste caso, quando o dígito a ser subtraído é menor do que o dígito a subtrair, é necessário utilizar um valor “emprestado” do dígito seguinte. Repare-se no exemplo do segundo dígito: 2 menos 6, como não é possível a 2 retirar 6, opta-se por a 12 retirar 6, indo retirar um valor do dígito seguinte. A este carry negativo chama-se em inglês borrow. Este vaor “emprestado” pelo dígito seguinte é, no passo seguinte, somado ao valor a subtrair. Desta forma, para os terceiros bits, é necessário a 0 tentar subtrair 9 (8+1 bit de borrow, o que origina novo bit de borrow para os quatro bits).
Adição e subtração em binário A figura seguinte apresenta dois números binários de 8 bits com a indicação a negrito do carry. A soma pode ser feita como em decimal, somando cada um dos bits individualmente. Apenas no caso de o resultado exceder o valor da base, não sendo, portanto, representável num único dígito binário, se torna necessário tomar nota da existência de carry.
1011011 101101102 + 100101112 1010011012 Repare-se que, no caso do segundo bit menos significativo, o resultado da soma é 2, originando uma situação de carry. Este carry é anotado sobre o bit seguinte, sendo necessário para este conjunto de bits somar três 1s. Nesta situação, o resultado direto da soma é 1, existindo em simultâneo um bit de carry a transportar para a soma seguinte. Representa-se outro exemplo da soma de dois números binários na figura seguinte:
111111 101111002 + 010101012 1000100012
A subtração de dois números em binário esta representada na seguinte figura:
1000111 101111002 - 010101012 011001112 Na subtração dos bits menos significativos, subtrair 1 a 0 implica uma necessidade de empréstimo do valor seguinte (assinalada com um 1 sobre o bit seguinte). Isto pode ser interpretado como subtrair 1 a 2 (10 em binário). Para o par de bits seguinte, dois zeros, é necessário fazer uso do bit emprestado, somando-o ao subtrator. Assim sendo, está a fazer-se a subtração de 1 a 0, o que origina uma nova situação de borrow. Nos terceiros bits menos significativos estão dois 1s e um bit de borrow. Isto implica somar o bit de borrow ao subtrator e subtrair 2 a 3 (11 em binário devido a um novo empréstimo), resultando em 1 como resultado direto da subtração. Este processo é repetido até a operação de subtração estar terminada. A figura seguinte apresenta um novo exemplo de subtração em binário.
111011 101011012 - 011101112 001101102 Neste caso, merece atenção o sétimo bit em que se pretender subtrair 1 a 0, existindo um bit de borrow. Esta situação corresponde a subtrair 2 a 2 (10 em binário, com necessidade de um novo bit de borrow), resultando em 0 resultado direto da subtração.
Adição e subtração em Octal As operações de adição e subtração em octal são muito semelhantes às feitas em binário e em decimal. A figura seguinte apresenta um exemplo de uma soma de dois números em octal. Devemos ter em atenção que, agora, o carry ocorre sempre que a soma parcial chegue, ou supere, o valor 8. Para este valor, a soma direta será 0 e xistirá um bit de carry que será somado ao bit mais significativo seguinte. Nos bits menos significativos, a soma de 6 e 7 resulta em 13 em decimal. Este valor em octal é 158, dando 5 na soma e um bit de carry. Para os seguintes bits é somado 7, 0 e 1, logo, a soma dá 0 e existe novo bit de carry.
11 2768 + 3078 6058 Um segundo exemplo de soma em octal está representado na figura seguinte:
111 36548 + 7258 46018
A figura seguinte apresenta um exemplo de subtração em base octal:
11 7028 - 3768 3048 Embora semelhante ao processo dos casos anteriores, convém detalhar a operação, uma vez que se trata de uma base diferente. Para os bits menos significativos pretende-se subtrair 6 a 2. Isto corresponde a uma situação em que é necessário pedir um “empréstimo” ao bit mais significativo seguinte, ou seja, fazer a subtração de 6 a 12 em octal. Habitualmente, pensamos em decimal e que 12 em octal corresponde a 10 em decimal. Assim sendo, o resultado direto desta operação é 4, existindo um bit de borrow. Este bit é adicionado ao 7 do bit seguinte, originando de imediato novo bit de borrow e sendo a operação direta 0 menos 0, de onde resulta 0. A subtração dos bits mais significativos corresponde a 7 menos 4, devido ao bit de borrow anterior. A seguinte figura apresenta outro exemplo de subtração em octal:
11 125238 - 76518 26528
Adição e subtração em Hexadecimal As operações de adição e subtração em hexadecimal são muito semelhantes às anteriores. Apresenta-se a seguir um exemplo de uma soma de dois números em hexadecimal:
1101 9 A0816 + CA3916 1644116 A soma dos dois dígitos menos significativos, 8 e 9, corresponde em decimal a 17, que em hexadecimal corresponde a 11 e necessita de mais do que um dígito para ser representado, originando por isso um bit de carry e resultado direto 1. A soma seguinte, dos dígitos 0 e 3, resulta na soma direta de 4, devido ao carry anterior e não origina novo carry. Os terceiros dígitos menos significativos são ambos A, ou seja, a soma em decimal tem valor de 20, o que é representado com dois dígitos de hexadecimal (14), tendo como soma direta 4 e originando um carry para a soma seguinte. No caso dos dígitos mais significativos, 9 e C, a soma direta atendendo ao carry anterior é, em decimal, de 22, o que corresponde em hexadecimal a 16. Nesta situação, o carry pode ser utilizado diretamente como um dígito de hexadecimal, uma vez que se trata do dígito mais significativo. Um outro exemplo de soma em hexadecimal está na figura seguinte:
1101 BA0 E16 + E 8 A716 1A2 B516
A figura seguinte apresenta um exemplo de subtração em base hexadecimal:
1 F 7 AB16 - 1C 6316 DB 4816 Nos dígitos menos significativos, B e 3, o resultado da subtração é 11-3=8, não havendo lugar a valor de borrow. Para os seguintes dígitos menos significativos, A e 6, a subtração é 10-6=4, não havendo também lugar a borrow. Para os terceiros dígitos, 7 e C, a operação correspondente é 7-12. Como não é possível, com números
positivos, fazer esta , torna-se necessário usar um valor de borrow. Ao retirar um valor ao dígito seguinte, dado que se está a trabalhar em hexadecimal, passa a fazer-se a seguinte subtração: 23-12=11, valor que é representado por B. Finalmente, para os dígitos mais significativos, F e 1, atendendo ao borrow do passo anterior, faz-se a operação 15-2=13, ou seja, D. Apresenta-se a seguir um outro exemplo de subtração em hexadecimal:
1 7 A4 F16 - 56 DB16 237416 Neste segundo exemplo pode verificar-se que a situação de borrow ocorre apenas no segundo dígito menos significativo. Neste caso, pretende-se subtrair D a 4. Como tal não é possível, usa-se um valor emprestado pelo dígito seguinte, passando agora a fazer-se, em decimal: 20-13=7.
Representação de números positivos e negativos As operações de subtração podem ter como resultado um valor negativo. Por este motivo, é importante saber como são representados os valores negativos em binário. Este tipo de representação pode ser feito de diversas formas: complemento para 1, complemento para 2, entre outras, pelo que é importante conhecer as vantagens e desvantagens de cada uma.
Representação em complemento para 1 A representação em complemento para 1 de um número negativo de n bits é obtida subtraindo-o a 2n-1. Em termos práticos, isto corresponde a negar todos os bits. Ou seja, todo bit 0 passa a ser bit 1 e todo bit originalmente 1 passa a ser 0. Neste tipo de notação, o bit mais significativo representa o sinal, isto é, se for 0 é positivo e se for 1 é negativo. Vejamos alguns exemplos da representação neste tipo de notação para 8 bits. 2110=000101012 -2110=111010102 A representação de -21 é obtida negando a totalidade dos bits da representação do correspondente valor positivo. Um novo exemplo é apresentado a seguir: 9710=01100001 2 -9710=100111102 A principal vantagem desta representação é a facilidade em obter o número negativo correspondente. A representação apresenta, no entanto, alguns problemas. Um deles diz respeito à representação do valor 0: 010=00000000 2 Existe, no entanto, uma outra representação possível para o valor 0, obtida a partir do valor -0: -010=111111112
Outro problema aparece quando se pretende fazer operações com números nesta representação. Observe-se a tabela seguinte: Decimal
Binário
-7
1000
-6
1001
-5
1010
-4
1011
-3
1100
-2
1101
-1
1110
0
0000 ou 1111
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
Nesta tabela estão representados os valores de complemento para 1 dos números de 4 bits. Repare-se que, ao percorrer a tabela, quando é necessário passar pelo valor 0, a mudança não corresponde ao acréscimo de um valor, como acontece em decimal, mas ao acréscimo de dois valores. Resulta daqui uma sugestão para fazer a soma em complemento para 1 corretamente: realizar a soma binária normal e somar 1 sempre que a contagem ultrapasse 2n-1. Este facto, resultante da dupla representação para o valor 0, cria problemas adicionais mesmo para operações em binário, mas quando se utilizam números negativos surgem algumas limitações desta notação. Vejamos alguns exemplos:
102 + (−)72 30
110011 011001102 +
101101112 1000111012
+
12 000111102
Neste caso pretende-se somar 102 com -72. O resultado direto desta operação é um número negativo, cujo valor absoluto é 29. Analisando a tabela anterior, pode corrigirse esta situação adicionando o bit que sobrou da soma direta (e “transbordou” para além do bit de sinal) ao resultado da soma, como está ilustrado na figura anterior. Esta correção corresponde à passagem por 0. Outro exemplo destas situações:
110011 001101002
52 + (−)72 - 20
+
101101112 111010112
Neste caso não é necessário efetuar qualquer correção. O resultado está correto, uma vez que não ultrapassou 2n-1. Vejamos outro exemplo:
- 52 + 72 20
110011 110010112 + 010010002 1000100112 +
12 000101002
No caso anterior, a soma ultrapassou o valor 2n-1, pelo que se torna necessário somar este bit adicional para obter o valor correto.
- 52 - 72 -124
110011 110010112 +
101101112 1100000102
+
12 100000112
Na figura anterior está apresentada uma nova operação. Neste caso trata-se de somar dois números negativos e, tal como no caso anterior, a contagem ultrapassou 2n-1, sendo também necessário somar o bit adicional. A representação em complemento para 1, tal como a representação em sinal e magnitude, não permite efetuar, mesmo as operações mais simples de forma direta.
Por esse motivo, surgiram outras formas de representar números negativos. A notação de complemento para 2 é um desses exemplos e resolve alguns dos problemas.
Representação em complemento para 2 Na representação em complemento para 2 existe também um bit de sinal, mas a transformação dos números negativos é um pouco mais complexa, enquanto os números positivos se mantêm inalterados, tal como nas outras representações. A notação em complemento para 2 de um número de n bits pode ser obtida subtraindo-o ao valor 2n. Vejamos um exemplo: Complemento para 2 de 01010111: 100000000-01010111=10101001 Conclui-se que o complemento para 2 de 87 é dado por 10101001 2. Deve notar-se que para este valor ser interpretado corretamente é necessário saber que se trata de um número em complemento para 2. Caso contrário, este valor, que corresponde a -87, pode ser interpretado como sendo o número positivo 169. Nota: Devemos ter a noção de que a informação contida, por exemplo, num disco rígido, está toda ela em binário. Apenas é possível distinguir entre um ficheiro criado pelo utilizador, uma fotografia ou um programa, se a informação relativa ao tipo de dados estiver guardada numa parte específica desse mesmo disco rígido. Caso contrário, tudo se resume a binário que pode ser interpretado de diversas formas e que facilmente perde o significado original.
A representação em complemento para 2 pode ser obtida sem o recurso à subtração indicada anteriormente. Existem duas outras regras práticas que permitem obter o complemento para 2. Qualquer uma das regras é válida. A primeira dessas regras consiste em negar todos os bits que compõem a representação positiva do número e, em seguida, adicionar-lhe um bit. Vejamos um exemplo desta regra na figura seguinte: negação
011101012 dos bits 11710
100010102
adicionar 1
100010112 -11710
A segunda possibilidade de conversão para complemento para 2 é uma variante da regra anterior. Consiste em percorrer a representação binária do número a converter, da direita para a esquerda, mantendo todos os bits até ao primeiro 1, inclusive, e negando todos os bits a partir daí. 010101002
8410
negar
101011002
-8410
Como foi explicado, qualquer destas regras permite obter a representação em complemento para 2 correta. Optamos por aquela que nos parecer mais fácil de utilizar. Nesta representação, caso seja necessário fazer uma extensão do número de bits, pode repetir-se o bit de sinal. Para o número decimal 66, 1000010 em binário, a representação positiva de 8 bits é: 01000010. A representação de 16 bits, quer a binária simples, quer a binária de complemento para 2 é: 0000000001000010. Para o mesmo valor negativo, a representação em complemento para 2 de 8 bits é 10111110. A representação correspondente de 16 bits pode obter-se repetindo o bit de sinal à esquerda 1111111110111110. Esta notação permite, para n bits, representar os valores do seguinte intervalo: -2n-1 a (2n-1-1)
Soma e subtração em complemento para 2 A grande vantagem da representação em complemento para 2 está na simplificação das operações. A subtração com números em complemento para 2 reduz-se a uma soma onde apenas é necessário ignorar os dígitos que ultrapassam o número de bits previsto para a representação. Vejamos alguns exemplos:
8 + ( −)5 3
1 010002 +
110112 1000112
A figura anterior apresenta um exemplo muito simples de soma de um número positivo com um negativo. Esta operação é equivalente a uma subtração mas, para a efetuar, é necessário obter previamente a representação de -5. Repare-se que, neste caso, é necessário eliminar um bit que excede os 5 bits usados na representação, mas o bit de sinal está correto.
Vejamos mais alguns exemplos: 1)
71 + 30 101
010001112 +
000111102 011001012
Neste caso, são somados dois números positivos, pelo que o bit de sinal do resultado, como seria de esperar, está a zero.
2)
121 + (-)70 51
011110012 +
101110102 1001100112
Neste caso é necessário eliminar um dígito que cresce ao somar os valores em complemento para 2.
3)
63 + (-)112 - 49
001111112 +
100100002 110011112
Neste exemplo são novamente somados dois números, sendo que um é positivo e o outro é negativo, mas desta vez o maior valor é o do número negativo. Obtém-se o resultado 11001111. Como o bit de sinal é 1, significa que o número é negativo.
4)
- 26 + (-)72 - 98
111001102 +
101110002 1100111102
Neste exemplo, o resultado é negativo e cresce novamente um bit da operação, que é eliminado. O valor obtido é 10011110, o que, uma vez tomado o seu complemento para 2, dá 01100010, correspondendo a 98.