Prévia do material em texto
REPRESENTAÇÃO DE DADOS
1 REPRESENTAÇÃO DE NÚMEROS INTEIROS (PONTO FIXO)
1.1 Tipos de Dados
1.2 Dados Numéricos
2 REPRESENTAÇÃO EM SINAL E MAGNITUDE
2.1 Faixa de Representação
2.2 Aritmética em Sinal e Magnitude
3 REPRESENTAÇÃO DE NÚMEROS NEGATIVOS EM COMPLEMENTO A (BASE -
1)
3.1 Representação em Complemento a (Base - 1)
3.2 Faixa de Representação
3.3 Aritmética em Complemento a (Base - 1)
3.4 Representação em Complemento a Base
3.5 Faixa de Representação
3.6 Aritmética em Complemento a Base
4 ARITMÉTICA BINÁRIA E EM COMPLEMENTO
4.1 Aritmética em Complemento - Soma em Complemento a 1
4.2 Aritmética em Complemento - Soma em Complemento a 2
4.3 Aritmética em Sinal e Magnitude
5 REPRESENTAÇÃO DE NÚMEROS REAIS
5.1 Dados Numéricos Fracionários (Ponto Flutuante)
6 ARITMÉTICA EM PONTO FLUTUANTE
6.1 Algoritmos da Soma, Subtração, Multiplicação e Divisão em Ponto Flutuante
7 REPRESENTAÇÃO DE CARACTERES E SÍMBOLOS
7.1 Códigos de representação de Letras e outros Símbolos
7. 2 Código ASCII
8 REPRESENTAÇÃO DE NÚMEROS DECIMAIS CODIFICADOS EM BINÁRIO
8.1 Representação BCD
1 REPRESENTAÇÃO DE NÚMEROS INTEIROS (PONTO FIXO)
Em um computador são armazenados e processados apenas dados e instruções. Um programa de computador é
formado por uma seqüência de instruções que operam sobre um conjunto de dados (os dados são os
operandos das instruções - ver capítulo sobre Representação de Instruções). Um computador executa operações
sobre dados numéricos (os números) ou alfabéticos (letras e símbolos). Por outro lado, um computador somente
opera sobre valores representados em notação binária, isto é, somente "entende" bits - uns e zeros. Assim, os
dados precisam ser representados no computador (na memória e no processador) sempre através de bits, de uma
forma que o computador possa interpretar corretamente o seu significado e executar as operações adequadas.
Em outras palavras, isso significa que é preciso definir uma forma de representar os dados, codificados em uns
e zeros, que possam ser interpretados pelo computador, de forma correta e eficiente (com bom desempenho e
pouco consumo de memória).
1.1 TIPOS DE DADOS
Um programa (a seqüência de instruções) deverá manipular diferentes tipos de dados.
Os dados podem ser:
--numéricos
---- ponto fixo (números inteiros)
---- ponto flutuante (números reais ou fracionários)
---- BCD (representação decimal codificada em binário)
-- alfabéticos
----- letras, números e símbolos (codificados em ASCII e EBCDIC)
O tipo de dado que está sendo fornecido ao programa deverá ser informado pelo programador, através de
declarações, fazendo com que o programa interprete o dado fornecido de acordo com a declaração. Por
exemplo, na linguagem C, declarações tipo
int num; (inteiro) ou
float sal (real);
indicam que a variável num é um número inteiro (int) e a variável sal é um número real (float), representação
científica, isto é, representado na forma
[(Sinal) Valor x Base (elevada a Expoente)].
Declarações tipo char letra; indicam que a variável é um caractere.
1.2 DADOS NUMÉRICOS
A forma mais intuitiva de representar números seria através da conversão do número decimal para seu
correspondente em binário. Como os computadores operam sempre em binário, essa seria a forma mais
imediata e eficiente.
Os números podem ser positivos ou negativos. Um aspecto primordial a ser definido seria então como
representar o sinal. Nesta representação foi definida a utilização de mais um bit na representação (o bit mais
representativo), representando o sinal, com a seguinte convenção:
bit 0 ==> sinal positivo
bit 1 ==> sinal negativo.
A seguir, apresentamos exemplos de números e sua representação em binário:
http://wwwusers.rdc.puc-rio.br/rmano/ri.html
Valor decimal Valor binário com 8 bits (7 + bit de sinal)
+9 00001001 (bit inicial 0 significa positivo)
-9 10001001 (bit inicial 1 significa negativo)
+127 01111111 (bit inicial 0 significa positivo)
-127 11111111 (bit inicial 1 significa negativo
Assim, uma representação em binário com n bits teria disponíveis para a representação do número n-1 bits (o
bit mais significativo representa o sinal). Essa representação tem o nome de representação em sinal e
magnitude.
2 REPRESENTAÇÃO EM SINAL E MAGNITUDE
A magnitude (isto é, o valor absoluto, que independe de sinal) de um número é representada em binário. O
sinal é representado por um bit (o bit mais significativo, isto é, o bit mais à esquerda na representação). Por
convenção, o bit de sinal 0 (zero) significa que o número é positivo e o bit 1 representa número negativo.
O valor dos bits usados para representar a magnitude independe do sinal, isto é, sendo o número positivo ou
negativo, a representação binária da magnitude será a mesma, o que varia é apenas o bit de sinal.
Ex.:
0011 = +3
1011 = -3
(011 equivale ao valor absoluto 3)
2.1 FAIXA DE REPRESENTAÇÃO
A representação na base b em sinal e magnitude com n bits (incluindo o bit de sinal) possui bn representações e
permite representar bn -1 valores, de vez que há duas representações para o zero.
A faixa de representação de uma representação na base 2 em sinal e magnitude com n bits (incluindo o bit de
sinal) possui
2n representações, representando os valores entre - ( 2n-1-1) e + ( 2n-1-1).
O maior valor inteiro positivo será então + ( 2n-1-1) e o menor valor inteiro negativo será - ( 2n-1-1).
Obs1.: o número de bits para a representação é determinado no projeto do computador.
Obs2.: em sinal e magnitude, existem duas representações para o zero.
2.2 ARITMÉTICA EM SINAL E MAGNITUDE
Algoritmo da soma
a) verificar o sinal das parcelas
b) se os sinais forem iguais:
-- repetir o sinal
-- somar as magnitudes
c) se os sinais forem diferentes
-- verificar qual parcela tem maior magnitude
-- repetir o sinal da maior magnitude
-- subtrair a menor magnitude da maior magnitude
Algoritmo da subtração
O algoritmo da subtração é o mesmo da soma, sendo feita como se fosse uma soma de dois números que
tem os sinais diferentes.
A representação em sinal e magnitude apresenta uma grande desvantagem: ela exige um grande número de
testes para se realizar uma simples soma de dois números inteiros. O algoritmo acima descrito é complicado de
ser realizado no computador, o que resulta em baixa eficiência (execução lenta). Um outro ponto negativo é
termos duas representações para o zero.
3 REPRESENTAÇÃO DE NÚMEROS NEGATIVOS EM COMPLEMENTO A (BASE - 1)
REPRESENTAÇÃO DE NÚMEROS EM COMPLEMENTO
Complemento é a diferença entre cada algarismo do número e o maior algarismo possível na base. Uma
vantagem da utilização da representação em complemento é que a subtração entre dois números pode ser
substituída pela sua soma em complemento.
REPRESENTAÇÃO DE NÚMEROS POSITIVOS EM COMPLEMENTO
A representação de números positivos em complemento não tem qualquer alteração, isto é, é idêntica à
representação em sinal e magnitude.
3.1 REPRESENTAÇÃO DE NÚMEROS NEGATIVOS EM COMPLEMENTO A (BASE - 1)
A representação dos números inteiros negativos é obtida efetuando-se: (base - 1) menos cada algarismo do
número. Fica mais fácil entender através de exemplos:
Ex.1: Calcular o complemento a (base - 1) do número 29710.
Se a base é 10, então 10-1 = 9 e o complemento a (base -1) será igual a complemento a 9
Ex.2: Calcular o complemento a (base - 1) do número 3A7EH.
Se a base é 16, então 10H-1 = F e o complemento a (base -1) será igual a complemento a F.
Portanto:
Ex.1 Ex.2
(base -1)---> 999 FFFF
-297 -3A7E
Complemento --->702 C581
Caso Particular: Números na Base 2 (Complemento a 1)
Para se obter o complemento a 1 de um número binário, devemos subtrair cada algarismo de 1. Uma
particularidade dos números binários é que, para efetuar esta operação, basta inverter todos os bits.
Como exemplo, vamos calcular o complemento a 1 (C1) de um número binário 0011 com 4 dígitos.1111
-0011
1100 (C1)
Portanto, bastaria inverter todos os bits!
Vamos analisar como ficaria a representação em C1 dos números binários de 4 dígitos:
Decimal
(positivo)
Binário (se o número é
positivo, não há
alteração)
Decimal
(negativo) Binário (em C1)
0 0000 0 1111
1 0001 -1 1110
2 0010 -2 1101
3 0011 -3 1100
4 0100 -4 1011
5 0101 -5 1010
6 0110 -6 1001
7 0111 -7 1000
3.2 FAIXA DE REPRESENTAÇÃO
A representação na base b em complemento a (base-1) com n bits possui bn representações e permite
representar bn -1 valores. Há duas representações para o zero.
A faixa de representação de uma representação na base 2 em complemento a (base-1) com n bits é a mesma que
em sinal e magnitude e pode ser calculada como
2n valores, entre - ( 2n-1-1) e + ( 2n-1-1)
O maior valor inteiro positivo será então + ( 2n-1-1) e o menor valor inteiro negativo será - ( 2n-1-1).
Obs1.: o número de bits para a representação é determinado no projeto do computador.
Obs2.: em C1 também existem duas representações para o zero.
Vamos verificar qual a faixa de representação nos seguintes exemplos:
Base 10 com 3 dígitos: a representação varia de 000 a 999 (103 representações), representando os números de -
499 a -1 (faixa negativa), de +1 a +499 (faixa positiva).
Base 10 Faixa Inferior
(positiva) Faixa Superior (negativa)
C1 1 2.... 498 499 500 501 ..... 997 998
Número
representado 1 2 .... 498 499 -499 -498 ..... -2 -1
O zero pode ser representado tanto por 000 quanto por 999.
Base 16 com 4 dígitos: a representação varia de 0000 a FFFF, representando os números de -7FFF a -0001
(faixa negativa) e de +0001 a +7FFF (faixa positiva).
Base 16 Faixa Inferior
(positiva)
Faixa Superior
(negativa)
C1 0001 0002 ... 7FFF 8000 8001 ....FFFE
Número
representado 0001 0002 ... 7FFF -7FFF -7FFE ...... -
0001
O zero pode ser representado tanto por 0000 quanto por FFFF.
Obs: Podemos concluir que, tal como na representação em sinal e magnitude, sempre que em uma
representação em complemento o primeiro dígito binário for 1, o número representado é negativo! Mas é
importante notar que o bit mais significativo, na representação em complemento, ao contrário do que
ocorre na representação em sinal e magnitude, NÃO REPRESENTA O SINAL DE NEGATIVO!
3.3 ARITMÉTICA EM COMPLEMENTO A (BASE - 1)
Na aritmética em complemento a (base-1), basta somar os números, sendo que um número negativo estará
representado por seu complemento. Ex.: Somar + 123 com - 418 (decimal).
Sinal e
magnitude
Complemento a (base-
1) Verificação
-418 581 (C9) 999
+123 +123 -295
-295 704 704
Verificamos que o resultado 704 (C9) é um número negativo, isto é, o complemento a 9 (base 10 -1) de 295.
Repare que a subtração (ou soma de um número positivo com um número negativo) se transforma, nesta
representação, em uma soma em complemento, isto é, a soma dos complementos do número positivo com o
número negativo! Portanto, numa subtração (realizada através de soma em complemento), se o número é
positivo, mantenha-o; se o número é negativo, complemente-o; e aí, é só somar! Dessa forma, podemos
constatar que o algoritmo da soma em complemento é muito mais simples que o da soma em sinal e magnitude,
de vez que não requer nenhum teste. No entanto, continuamos com duas representações para o zero. Vamos a
seguir discutir a solução para esse problema.
3.4 REPRESENTAÇÃO DE NÚMEROS NEGATIVOS EM COMPLEMENTO A BASE
A representação dos números inteiros negativos em complemento a base é obtida subtraindo-se da base cada
algarismo do número. Ora, seria a mesma coisa subtrair cada algarismo de (base-1), isto é, calcular o
complemento a (base -1) e depois somar 1 ao resultado, ou seja:
b - N = [(b-1) - N] + 1.
Ou seja, encontramos o complemento a (base-1) do número (o que facilita muito no caso dos números binários)
e depois somamos 1 ao resultado. Fica mais fácil entender através de exemplos:
Ex.1: Calcular o complemento a base do número 29710.
Se a base é 10, o complemento a base será igual a complemento a 10.
Ex.2: Calcular o complemento a base do número 3A7Eh.
Se a base é 16 (lembremos mais uma vez que o H ou h depois do número simboliza "hexadecimal"), o
complemento a base será igual a complemento a 1610 ou 10h.
Portanto, calculando o complemento a base dos números acima, temos:
Ex.1 Ex.1
(alternativa) Ex.2
1000 999 FFFF
- 297 -297 -3A7E
702 702 C581
+001 +0001
703 C582
Caso Particular: Números na Base 2 (Complemento a 2)
Para se obter o complemento a 2 de um número binário, a regra geral nos diz para subtrair cada algarismo de 2.
Ora, seria a mesma coisa subtrair cada algarismo de 1 (complemento a 1) e depois somar 1 ao resultado, ou
seja: (2-N) = (1-N) + 1. Assim, tirando partido da particularidade dos números binários anteriormente
apresentada (para obter o C1 de um número binário, basta inverter todos os bits), para obter o C2 de um
número obtemos primeiro o C1 (invertendo os bits) e depois somamos 1 ao resultado.
Como exemplo, vamos calcular o complemento a 2 (C2) de um número binário 0011 com 4 dígitos.
1111
-0011
1100 (C1)
+0001
1101 (C2)
Vamos analisar como ficaria a representação em C2 dos números binários de 4 dígitos:
Decimal
(positivo)
Binário (se o número é
positivo, não há
alteração)
Decimal
(negativo) Binário (C2)
0 0000 -1 1111
1 0001 -2 1110
2 0010 -3 1101
3 0011 -4 1100
4 0100 -5 1011
5 0101 -6 1010
6 0110 -7 1001
7 0111 -8 1000
Vemos assim que em C2, não há duas representações para o valor 0 e conseqüentemente abriu-se lugar
para mais uma representação - no caso, mais um número negativo pode ser representado.
3.5 FAIXA DE REPRESENTAÇÃO
A representação na base b em complemento a base com n bits possui bn representações e permite representar bn
valores.
A faixa de representação de uma representação na base 2 em complemento a base com n bits pode ser calculada
como
2n valores (entre - 2n-1 e + 2n-1-1), sendo 2 a base.
O maior valor inteiro positivo será então + ( 2n-1-1) e o menor valor inteiro negativo será - ( 2n-1).
Obs1.: o número de bits para a representação é determinado no projeto do computador.
Obs2.: nesta representação somente existe uma representação para o zero e há mais um número negativo
representado!
Nos exemplos acima, vamos verificar qual a faixa de representação:
Base 10 com 3 dígitos: de 0 a 999 (103 valores), representando de -500 a -1 (faixa negativa) e de 1 a +499 (faixa
positiva). O zero tem apenas uma representação: 000.
Base 10 Faixa Inferior (positiva) Faixa Superior (negativa)
C2 1 2 .... 499 500 501 ..... 999
Número representado 1 2 .... 499 -500 -499 ... -1
Base 16 com 4 dígitos: de 0 a FFFF, representando -8000 a -1 (faixa negativa) e de 0 a +7FFF (faixa positiva).
O zero tem apenas uma representação: 0000.
Base 16 Faixa Inferior Faixa Superior
(positiva) (negativa)
C2 0001 0002 ... 7FFF 8000 F001 ...... FFFF
Número
representado 0001 0002 ... 7FFF -8000 -7FFF... -0001
Obs: Podemos concluir que, tal como na representação em sinal e magnitude e em complemento a (base-
1), sempre que em uma representação em complemento a base o primeiro dígito binário for 1, o número
representado é negativo! Mas é importante notar que o bit mais significativo, na representação em
complemento, ao contrário do que ocorre na representação em sinal e magnitude, NÃO REPRESENTA
O SINAL DE NEGATIVO!
3.6 ARITMÉTICA EM COMPLEMENTO A BASE
Na aritmética em complemento a base, basta somar os números, sendo que um número negativo estará
representado por seu complemento a base. Ex.: Somar +123 com -418 (decimal).
Sinal e
magnitude Cálculo C2 C2 Verificação
-418 999 582 999
+123 -418 +123 -295
-295 581 (C1) 705 (C2) 704
+001 +001
582 (C2) 705
Verificamos que o resultado 705 (C2) é um número negativo, isto é, o complemento a 10 (base 10) de 295.
Repare que a subtração (ou somade um número positivo com um número negativo) se transforma em uma
soma em complemento, isto é, a soma dos complementos do número positivo com o número negativo!
Portanto, se o número é postivo, mantenha-o; se o número é negativo, complemente-o; e aí, é só somar! Dessa
forma, podemos constatar que o algoritmo da soma em complemento é muito mais simples que o da soma em
sinal e magnitude, de vez que não requer nenhum teste.
4 ARITMÉTICA BINÁRIA E EM COMPLEMENTO
Nesta seção, vamos rever os conceitos já apresentados sobre aritmética binária e em complemento e resolver
alguns exercícios para exemplo. Inicialmente, vamos considerar apenas números positivos (o sinal não será
representado).
Exemplo de Operações de Adição
BASE 2 BASE 8 BASE 8 BASE 16 BASE 16
111 11 _11 111 111
0111 0762 7142 A679 6FACB
+0101 + 0365 +0576 +49FB +4ED93
1100 1347 7740 F074 BE85E
Exemplo de Operações de Subtração
BASE 2 BASE 8 BASE 8 BASE 16 BASE 16
111 0762 7142 A679 6FACB
-101 - 0365 -0576 -49FB -4ED93
010 0375 6344 5C7E 20D38
Exercício:
Suponha um sistema posicional de numeração na base 6. Determine os valores de R, S, T, V, X e Z.
RVTZR
+ SRSVZ
TFXVZS
Inicialmente, devemos considerar que cada uma das letras representa um algarismo, sem qualquer valor pré-
determinado.
a) T = 1, porque: T só pode ser 1; a soma de dois algarismos, em qualquer base b, será no máximo igual a (2b) -
1 e portanto o "vai-um" nunca será "vai dois"!.
b) V = 0, porque: como Z + V = Z, concluimos que V = 0 e a soma R + Z = S (não vai-um).
c) S = 5, porque T + S = 0 o que significa que T + S = 6 (porque não pode ser 0, logo é 0 + base = 6 e vai um
para a próxima casa) e como T = 1, temos portanto S = 5.
d) Assim, R + V = X, como V = 0 e veio 1 da casa anterior, temos que X = 1 + R
Substituindo, temos que R + S = Z + 6 logo
R - Z = 1
R + Z= 5; somando as expressões, temos 2R = 6 ou
R = 3 logo
Z = 2 e
X = 4
4.1 ARITMÉTICA EM COMPLEMENTO - SOMA EM COMPLEMENTO A UM
O algoritmo da soma em complemento a um é:
a) Somar os dois números, bit a bit, inclusive o bit de sinal.
b) Avaliação dos casos de "vai-um":
b.1) Se não ocorreu vai-um para o bit de sinal nem para fora do número:
--- este é o resultado correto;
b.2) Se ocorrer "vai-um" só para o bit de sinal (e não para fora do número):
--- incorreto - ocorreu overflow
------- (isto significa que o resultado excede a faixa de representação para o número de bits adotado).
b.3.1) Se ocorrer "vai-um" para fora do número:
--- para obter o resultado final, soma-se o "vai-um" externo (para fora do número) ao resultado da soma; o bit
para fora do número (que excede o número de bits adotado na representação) é desprezado.
b.3.2) Nesta soma final também pode ocorrer "vai-um" no último bit;
--- se o número de "vai-um" ocorridos (para o bit de sinal, para fora do número ou na soma final) for par (o que
equivale a inverter duas vezes o sinal),
------ o resultado está correto;
--- se o número for ímpar (1 ou 3 "vai-um"):
------ o resultado está incorreto - ocorreu overflow.
Exemplos (referidos aos casos acima), considerando representação com 6 bits:
caso b.1:
15 +10 =
2510
caso b.2:
15 + 22 = 3710
caso b.3:
-15 -10 = -2510
caso b.3:
-15 -22 = -3710
_111 1111 1 1 1
001111 (+) 001111 (+) 110000 (-) 110000 (-)
+ 001010 (+) + 010110 (+) + 110101 (-) + 101001 (-)
011001 (+) 100101 (-) 100101 011001
+ ______1 + ______1
100110 (-) 011010 (+)
CORRETO OVERFLOW CORRETO OVERFLOW
(não ocorreu
"vai-um")
(só ocorreu
"vai-um" para
o bit de sinal)
(ocorreu "vai-
um" p/ bit de
sinal e p/ fora
do nº mas não
na soma final
- nº de "vai-
um" é par)
(ocorreu "vai-
um" só p/ fora
do nº mas não
na soma final
- nº de "vai-
um" é ímpar)
obs.: soma de
dois nº
positivos não
poderia dar
negativo
obs.: soma de
dois nº
negativos não
poderia dar
positivo
A faixa de repreentação com 6 bits em C1 vai de -31 a +31. Conferindo as contas pela representação decimal,
vemos que os resultados fora desta faixa excedem a faixa da representação e não podem ser representados com
6 bits (portanto, com este número de bits, ocorre overflow).
Existe um teste prático que, quando ambos os números tem o mesmo sinal, pode mostrar se ocorreu overflow e
o resultado obtido está incorreto: basta ver que na soma de dois números negativos, o resultado só pode ser
negativo, e a soma de dois números positivos só poderia dar resultado positivo!
4.2 ARITMÉTICA EM COMPLEMENTO - SOMA EM COMPLEMENTO A DOIS
O algoritmo da soma (ou subtração) em complemento a dois é:
a) Somar os dois números, bit a bit, inclusive o bit de sinal.
b) Despreza-se o bit para fora do número, se houver.
c.1) Se não ocorreu vai-um para o bit de sinal nem para fora do número ou
c.2) Se ocorrer "vai-um" tanto para o bit de sinal quanto para fora do número (equivale a inverter duas vezes o
sinal):
--- o resultado está correto;
d.1) Se ocorrer "vai-um" só para o bit de sinal (e não para fora do número):
d.2) Se não ocorrer "vai-um" para o bit de sinal e somente ocorrer para fora do número:
--- o resultado é incorreto - ocorreu overflow
------- (isto significa que o resultado excede a faixa de representação para o número de bits adotado).
Nota: Podemos constatar que o algoritmo de soma em C2 é bem mais simples que o de soma em C1.
Exemplos (referidos aos casos acima), considerando representação com 6 bits:
caso c.1:
15+10 = 2510
caso d.1:
15 + 17 = 3210
caso c.2:
-15 -10 = -2510
caso c.2:
-15 -17 = -3210
caso d.2:
-15 -27 = -4210
_111 11111 1 1 11111 1 ____1
001111 (+) 001111 (+) 110001 (-) 110001 (-) 110001 (-)
+ 001010 (+) + 010001 (+) + 110110 (-) + 101111 (-) + 100101 (-)
011001 (+) 100000 (-) 100111 (-) 100000 (-) 010110 (+)
CORRETO OVERFLOW CORRETO CORRETO OVERFLOW
(não ocorreu
"vai-um")
(só ocorreu
"vai-um" para
o bit de sinal)
(ocorreu "vai-
um" p/ bit de
sinal e p/ fora
do nº - o nº de
"vai-um" é
par)
(ocorreu "vai-
um" p/ bit de
sinal e p/ fora
do nº - o nº de
"vai-um" é par)
(só ocorreu "vai-
um" p/ fora do nº -
o nº de "vai-um" é
ímpar)
obs.: soma de
nº positivos
não poderia
dar negativo
(despreza-se o
"vai-um" para
fora do
número)
(despreza-se o
"vai-um" para
fora do
número)
obs.: soma de nº
negativos não
poderia dar
positivo (despreza
"vai-um" p/ fora
do nº)
A faixa de repreentação com 6 bits em C2 vai de -32 a +31. Conferindo as contas pela representação decimal,
vemos que os resultados fora desta faixa estão necessariamente incorretos (ocorreu overflow)
Pode-se aplicar o mesmo teste prático que, quando ambos os números tem o mesmo sinal, pode mostrar se
ocorreu overflow e o resultado obtido está incorreto: basta ver que na soma de dois números negativos, o
resultado só pode ser negativo, e a soma de dois números positivos só poderia dar resultado positivo!
4.3 ARITMÉTICA EM SINAL E MAGNITUDE
Em sinal e magnitude, o algoritmo da soma é:
a) Se os números forem de mesmo sinal, basta somar os dois números e manter o sinal;
b) Se os números forem de sinais diferentes, subtrai-se o menor número do maior; o sinal será o do maior
número.
c) Tem-se overflow sempre que ocorrer "vai-um" da magnitude para o bit de sinal (o número de bits da
magnitude foi excedido).
__1 1 1
0010
(positivo) 1001
(negativo)
0110 (positivo e
maior)
1110 (negativo e
maior) 1110
(negativo)
+ 0101
(positivo) + 1101
(negativo) + 1010 (negativo e
menor) + 0100 (positivo e
menor) + 1101
(negativo)
0111 1110 0100 1010 1011
CORRETO CORRETO CORRETO CORRETO OVERFLOW
ambos
positivos ->
soma e
mantém o
sinal positivo
ambos
negativos ->
soma e
mantém o
sinal
negativo
sinais contrários
-> subtrai
maior magnitude é
positivo -> resultado é
positivo
sinais contrários
-> subtrai
maior magnitudeé
negativo -> resultado é
negativo
ambos
negativos ->
soma
"vai-um"
para bit de
sinal ->
overflow
5 REPRESENTAÇÃO DE NÚMEROS REAIS
Até agora, passamos por cima de alguns outros problemas. Os dados numéricos podem ser fracionários (tais
como 57,683). Como representar essa parte fracionária (após a vírgula que a separa da parte inteira), de forma
que permita processamento eficiente e armazenamento com pouco consumo de memória? Vamos analisar esses
problemas logo à frente.
NÚMEROS REAIS
Números reais são aqueles com parte fracionária (por exemplo, 57,683). Estamos acostumados a representar
esses números no formato parte inteira, vírgula (ou ponto), parte fracionária:
Esta representação, embora cômoda para cálculos no papel, não é adequada para processamento no
computador.
5.1 REPRESENTAÇÃO EM PONTO FLUTUANTE
Consideremos o número 57,683 usado acima como exemplo. Este número pode ser também expresso como
57,683 x 100. E também poderia ser expresso com 57683 x 10-3 ou ainda 0,57683 x 102. Na realidade, qualquer
número - inteiro ou fracionário - pode ser expresso neste formato número x base expoente, em que variamos duas
coisas: a posição da vírgula (que delimita a parte fracionária) e a potência à qual elevamos a base. Essa
representação é denominada representação em ponto flutuante, pois o ponto varia sua posição, modificando,
em conseqüência, o valor representado.
REPRESENTAÇÃO NORMALIZADA
Na representação normalizada, o número é preparado movendo a vírgula para a direita ou para a esquerda de
forma que o número seja menor que 1, o mais próximo possível de 1, obviamente multiplicado por uma
potência da base de forma a manter o valor do número. Em geral, isso significa que o primeiro dígito
significativo seguirá imediatamente ao ponto (ou vírgula).
Por exemplo:
57,68310 --> normalizando ==> 0,57683 x 102
0,000462810 --> normalizando ==> 0,4628 x 10-3
0,000010112 --> normalizando ==> 0,1011 x 2-4
De forma genérica, podemos representar a forma normalizada:
± número x base ±expoente
A parte do número representado dessa forma normalizada (os algarismos significativos), damos o nome de
mantissa.e portanto podemos representar:
± 0,M x B ± e
onde M é a mantissa, B é a base e e é o expoente.
REPRESENTAÇÃO DE NÚMEROS REAIS NO COMPUTADOR
Uma forma comum de representação de números reais no computador pode ser expressa como segue:
Pode-se notar que a base não é expressa. Como a base, para cada computador, será sempre a mesma, não há
necessidade de apresentar a base na representação (no exemplo, a base é 2). Dizemos que a base é implícita.
Para cada computador, o número total M de bits para a representação, o número de bits para SN (sinal do
número), para SE (sinal do expoente), para a mantissa e para o expoente, são pré-definidos em projeto.
Assim, podemos concluir que, quanto maior o número de bits para o expoente, maior será a faixa de números
que o computador pode representar (maior alcance); e quanto maior o número de bits para a mantissa, maior a
precisão da representação. Porém, reduzindo-se a mantissa, perde-se precisão e há maior a necessidade de
truncar o número (truncar um número é cortar algarismos significativos que não podem ser representados).
Considerando-se a representação acima, na base implícita 2:
maior expoente possível E: 2x - 1
maior mantissa possível: 2y - 1
maior número real: +(0.111...1 x 2E) sendo E = 2x - 1
menor número real: -(0.111...1 x 2E) sendo E = 2x - 1
menor real positivo: +(0.100...0 x 2 -E sendo E = 2x - 1
maior real negativo: -(0.100...0 x 2 -E sendo E = 2x - 1
FAIXA DE REPRESENTAÇÃO
Como vimos anteriormente, a representação em ponto flutuante tem limites de alcance e de precisão. O alcance
é limitado pelo número de bits do expoente. A precisão é determinada pelo número de bits da mantissa.
Ocorre overflow quando o valor absoluto do dado a ser representado excede a capacidade de representação,
porque o número de bits do expoente (neste caso, positivo) é insuficiente para representar o dado.
Um outro problema ocorre na região de números próximos de zero, que tem o maior expoente negativo
possível. Ocorre underflow quando o valor absoluto do dado a ser representado é tão pequeno que fica menor
que o menor valor absoluto representável. Nesse caso, o expoente é negativo mas não representa os números
muito próximos de zero e ocorre uma descontinuidade na representação, com os números próximos a zero não
sendo representados.
Underflow não é o mesmo que imprecisão. Dados na faixa de underflow não podem ser representados,
ocorrendo estouro no expoente. No caso de imprecisão, a normalização permite que o dado seja representado,
porém com perda de precisão.
CARACTERÍSTICA
Característica é o expoente, representado na forma de excesso de n, ou seja,
CARACTERÍSTICA = EXPOENTE + EXCESSO
A representação substituindo expoente por característica acarreta que todas as características serão positivas, de
forma que é possível eliminar a representação do sinal do expoente.
Se CARACTERÍSTICA = EXPOENTE + EXCESSO,
sendo M o número de bits para a representação da característica, temos:
0 = - 2M-1 + EXCESSO logo: EXCESSO = + 2M-1
EXEMPLO DE REPRESENTAÇÃO EM PONTO FLUTUANTE
a) Representação no IBM /370
A família IBM /370 representa os dados em ponto flutuante com base implícita = 16, no seguinte formato:
sendo
SN = sinal do dado
CARACTERÍSTICA = o expoente, representado na forma de excesso de n, ou seja,
CARACTERÍSTICA = EXPOENTE + EXCESSO
No caso da IBM, o excesso é de 6410, portanto: CARACTERÍSTICA = EXPOENTE + 6410
Exemplificando: expoente = 810, logo característica = 810 + 6410 = 7210
Assim, uma característica entre 0 e 6310 significa que o expoente é negativo, enquanto uma característica entre
65 e 127 significa que o expoente é positivo (característica igual a 6410 significa expoente igual a 0)..
Exemplo: Representar 25,510
Como a base implícita é 16, vamos converter para hexadecimal: 25 / 16 = 1, resto 9 logo: 2510 = 1916
Parte fracionária: 0.5 x 16 = 8,0
Logo: 25,510 = 19,816 x 160
Normalizando: 19,816 x 160 = 0,19816 x 162. Em binário com 24 bits, a mantissa normalizada será:
0,19816 = 0001.1001.1000.0000.0000.0000
Obs.: Como o número 0,19816 será representado em 24 bits, os bits não representativos (à direita) serão
preenchidos com zeros.
Como o expoente é 2, a característica será: 210 + 6410 = 6610. Em binário com 7 bits, será: 100.0010
Portanto, a representação será:
b) Representação no PDP 11
Os microcomputadores PDP 11 representam os dados em ponto flutuante com base implícita = 2, no seguinte
formato:
sendo
SN = sinal do dado
CARACTERÍSTICA = o expoente, representado na forma de excesso de n, ou seja,
CARACTERÍSTICA = EXPOENTE + EXCESSO
No caso do PDP 11, o excesso é de 12810, portanto: CARACTERÍSTICA = EXPOENTE + 12810
Exemplificando: expoente = - 28 logo característica = - 2810 + 12810 = 10010
Assim, uma característica entre 0 e 12710 significa que o expoente é negativo, enquanto uma característica entre
129 e 255 significa que o expoente é positivo (característica igual a 1280 significa expoente igual a 0).
Exemplo: Representar 25,510
Como a base implícita é 2, vamos converter para binário: 2510 = 110012
Parte fracionária: 0.5 x 2 = 1,0
Logo: 25,510 = 11001,12 x 20
Normalizando: 11001,12 x 20 = 0,1100112 x 25.
Obs.: Como a base implícita no PDP 11 é 2, o número normalizado começará SEMPRE por 0,1. Assim, como o
primeiro dígito da mantissa será sempre 1, o PDP 11 economiza um bit na mantissa não armazenando o
primeiro bit da mantissa, já que está implícito que todos os números terão mantissa iniciando com 1. O bit
economizado dessa forma permite que, embora a mantissa no PDP seja representada com 23 bits e no IBM /370
com 24 bits, a precisão na representação é a mesma.
Obs.1: Leia-se o SEMPRE da obs. acima como quase sempre. A única exceção corre por conta do zero, que
nessecaso tem um tratamento especial.
Em binário com 23 bits, a mantissa normalizada será (lembrando que o primeiro bit 1 não é representado):
0,1100112 = 100.1100.0000.0000.0000.0000
Obs.: Como o número 0,1100112 será representado em 23 bits, os bits não representativos (à direita) serão
preenchidos com zeros.
Como o expoente é 5, a característica será: 510 + 12810 = 13310. Em binário com 8 bits, será: 1000.0101
Portanto, a representação será:
Exercício: Qual das representações de ponto flutuante nos dois computadores exemplificados acima tem o
maior alcance?
Resp.: O alcance de uma representação depende do valor da base implícita, elevado ao maior valor que a
característica pode assumir.
O maior alcance será o que tiver o maior valor de Be ou seja, base elevada ao maior valor possível da
característica.
O IBM /370 tem 7 bits para característica (maior característica = 63) e base implícita 16, portanto 1663 = (24) 63 =
2252
O PDP tem 8 bits para característica (maior característica = 127) e base implícita 2, portanto 2127
Conclusão: A representação em ponto flutuante do IBM /370 tem maior alcance que a do PDP 11.
6 ARITMÉTICA EM PONTO FLUTUANTE
6.1 Algoritmos da Soma, Subtração, Multiplicação e Divisão em Ponto Flutuante
SOMA E SUBTRAÇÃO EM PONTO FLUTUANTE
Alguns computadores não tem suporte de hardware para fazer operações aritméticas em ponto flutuante.
Alguns dispõem de processadores especializados que podem ser adquiridos como opcionais. Outros não tem
esse recurso nem como opcional e nesse caso, as operações aritméticas em ponto flutuante são resolvidas
através de programa (isso é, por software).
Algoritmo:
a) Verifica-se se uma das mantissas a operar é zero; caso afirmativo:
- se for uma soma e uma das parcelas for zero ---> o resultado é igual à outra parcela
- se for uma subtração e o subtraendo for zero ---> o resultado é igual ao minuendo
- se for uma subtração e o minuendo for zero ---> o resultado é igual ao subtraendo, com o sinal invertido
b) Se não houver zeros:
- reduzir ao mesmo expoente (o maior);
- somar / subtrair as mantissas;
- normalizar o resultado.
(m1 x be1) + (m2 x be2) = (m1 x be1) + (m3 x be1) = (m1 + m3 ) x be1
(m1 x be1) - (m2 x be2) = (m1 x be1) - (m3 x be1) = (m1 - m3 ) x be1
MULTIPLICAÇÃO EM PONTO FLUTUANTE
Algoritmo:
a) Verifica-se se uma das mantissas a operar é zero; caso afirmativo, o resultado é zero;
b) Se não houver zeros:
- somar os expoentes;
- multiplicar as mantissas;
- normalizar o resultado.
(m1 x be1) x (m2 x be2) = (m1 x m2) b(e1+e2)
Obs.: Ao fazer a soma dos expoentes, verificar qual a representação do expoente.
- se o expoente estiver representado em Sinal e Magnitude, usar o algoritmo de soma em S/M;
- se o expoente estiver representado em excesso de N (característica), ao somar as características estaremos
somando N duas vezes; como característica é o expoente mais excesso de N, é necessário subtrair N da soma:
(e1 + N) + (e2 + N) = (e1 + e2 + 2 N) logo é preciso subtrair N do resultado.
DIVISÃO EM PONTO FLUTUANTE
Algoritmo:
a) Verifica-se se uma das mantissas a operar é zero; caso afirmativo:
- se o divisor é zero, é impossível e dá erro por divisão de zero;
- se o dividendo é zero, o resultado é igual a zero.
b) Se não houver zeros:
- subtrair os expoentes;
- dividir as mantissas;
- normalizar o resultado.
(m1 x be1) / (m2 x be2) = (m1 / m2) b(e1-e2)
Obs.: Ao fazer a subtração dos expoentes, verificar qual a representação do expoente.
- se o expoente estiver representado em Sinal e Magnitude, usar o algoritmo de subtração em S/M;
- se o expoente estiver representado em excesso de N (característica), ao subtrair as características estaremos
eliminando N; como característica é o expoente mais excesso de N, é necessário somar N ao resultado:
(e1 + N) - (e2 + N) = (e1 - e2) + (N - N) logo é preciso somar N ao resultado.
7 REPRESENTAÇÃO DE CARACTERES E SÍMBOLOS
A representação de caracteres e símbolos em computador é feita atribuindo-se a cada caractere ou símbolo um
código binário. Desta forma são construídas tabelas (padrões) em que cada código binário representa para o
computador um determinado caractere ou símbolo.
Cada computador (ou cada fabricante) adota um determinado padrão. O número de bits que será utilizado no
padrão é uma decisão do fabricante e determinará quantos caracteres (e símbolos) poderão ser representados.
Nota: Se um padrão utiliza 7 bits, será possível representar até 27 = 128 caracteres e símbolos e com 8 bits serão
28 = 256.
O principal padrão hoje utilizado é o ASCII, de 7 bits, com uma variação de 8 bits (ASCII extendido) em que o
8º bit permite representar outros 128 símbolos.
Nota 1: Nos computadores PC, devido às diferenças lingüísticas, com a necessidade de representar caracteres
diferentes para para dar suporte a outras línguas que não o inglês, foram criadas diversas "páginas de código".
Por exemplo, a página de código 437 refere-se aos Estados Unidos, a 850 é a Multilingüe (Latin I), a 860 para
Português (incluindo caracteres que não existem no inglês, tais como ç e os acentos).
Nota 2: ASCII é um acrônimo para American Standard Code for Information Interchange (ou Código Padrão
Americano para Intercâmbio de Informações).
A seguir, apresentamos alguns exemplos de códigos da tabela ASCII:
Decimal Binário Caractere
48 a 57 0011.0000 a
0011.1001 de 0 até 9 (algarismos)
65 a 90 0100.0001 a
0101.1010
de A até Z
(maiúsculas)
97 a 122 0110.0001 a
0111.1010 de a até z (minúsculas)
36 0010.0100 $
42 0010.1010 *
43 0010.1011 +
63 0011.1111 ?
64 0100.0000 @
128 1000.0000 Ç
135 1000.0111 ç
132 1000.0100 ã
142 1000.1110 Ã
172 1010.1100 ¼
167 1010.0111 º
166 1010.0110 ª
225 1110.0001 ß
241 1111.0001 ±
Nota: Até 127, os códigos pertencem à tabela ASCII padrão, enquanto os códigos entre 128 e 255 fazem parte
do ASCII extendida, podendo variar o caractere ou símbolo representado conforme a página de código
configurada.
Outros padrões foram e ainda são usados, por exemplo o EBCDIC (Extended Binary Coded Decimal
Interchange Code, de 8 bits, usados nos computadores de grande porte IBM).
8 REPRESENTAÇÃO DE NÚMEROS DECIMAIS CODIFICADOS EM BINÁRIO
A representação de números reais em ponto flutuante é perfeitamente adequada para fazer cálculos
matemáticos, científicos, etc. No entanto, nessa representação podemos ter perda de precisão do número
representado ou mesmo haverá números que não podem ser representados por overflow (excedem o número de
bits do expoente). Quando estamos representando números em que é necessário manter precisão até o último
algarismo, tal como nos cálculos usados em procedimentos financeiros (o seu saldo no banco, por exemplo) não
é admissível erro por aproximação.
Para resolver essa restrição, foi desenvolvida uma outra representação: BCD ou Binary Coded Decimal (ou
seja, Decimal Representado em Binário). A idéia do BCD é representar, em binário, cada algarismo de per si,
de forma a que o número original seja integralmente preservado. A codificação BCD não possui extensão fixa,
possibilitando representar números com precisão variável - quanto maior o número de bits, maior será a
precisão. O microprocessador Intel 8080 suporta instruções de aritmética em BCD (p.ex.: instrução DAA).
TABELA DE REPRESENTAÇÃO DOS NÚMEROS DECIMAIS EM BCD
DECIMAL BCD DECIMAL BCD
0 0000 8 1000
1 0001 9 1001
2 0010 inválido 1010
3 0011 inválido 1011
4 0100 inválido 1100
5 0101 inválido 1101
6 0110 inválido 1110
7 0111 inválido 1111
Assim, o número 148 seria representado em BCD como:
1 = 00012
4 = 01002 e
8 = 10002, logo:
148 = 000101001000 (BCD).
Exemplo 1: representação do número 14958 em BCD:
1 4 9 5 8 número decimal
xxxx00
01
xxxx01
00
xxxx10
01
xxxx01
01
xxxx10
00 representação BCD
a+4 a+3 a+2 a+1 a endereço
A codificação de um dígito em BCD requer 4 bits. Como a utilização de apenas 4 bits porbyte não é eficiente,
normalmente são armazenados 2 dígitos BCD em um só byte. Esta representação é chamada BCD comprimido
("packed BCD"). Podemos constatar que ainda assim há um desperdício de códigos; como BCD usa 4 bits
(logo, haveria 16 representações possíveis) para representar 10 algarismos, 6 códigos não são utilizados.
Portanto, essa representação é menos eficiente em relação à utilização dos recursos do computador que a
representação em ponto flutuante.
Exemplo 2: representação do número 14958 em BCD comprimido:
1 49 58 número decimal
xxxx10
01
010010
01
010110
00 representação BCD comprimido
a+2 a+1 a endereço
Os algoritmos da aritmética em BCD são os mesmos que os correspondentes à aritmética em decimal, à qual
sempre estivemos acostumados. Por exemplo, na soma em BCD, soma-se os algarismos individualmente, em
decimal; quando a soma ultrapassa dez, "vai um" para o dígito de maior ordem (a próxima "casa"), e assim por
diante.
Exemplo.:
DECIMAL BCD
25 00100101
+38 +00111000
513 01011101
+110- +00011010-
63 01100011