14
Atualizado em Prof. Rui Mano E-mail: [email protected] REPRESENTAÇÃO DE DADOS 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

Sinal e Magnitude, Complementos a 1 e 2

Embed Size (px)

Citation preview

Page 1: Sinal e Magnitude, Complementos a 1 e 2

Atualizado em

Prof. Rui ManoE-mail: [email protected]

REPRESENTAÇÃO DE DADOS

 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 16111 11 _11 111 1110111 0762 7142 A679 6FACB

+0101 +0365 +0576 +49FB +4ED931100 1347 7740 F074 BE85E

Exemplo de Operações de Subtração

BASE 2 BASE 8 BASE 8 BASE 16 BASE 16111 0762 7142 A679 6FACB

-101 -0365 -0576 -49FB -4ED93010 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

Page 2: Sinal e Magnitude, Complementos a 1 e 2

+ SRSVZTFXVZS

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 + RSubstituindo, temos que R + S = Z + 6 logo R - Z = 1R + Z= 5; somando as expressões, temos 2R = 6 ou R = 3 logoZ = 2 eX = 4

ARITMÉTICA EM COMPLEMENTO - SOMA EM COMPLEMENTO A UMO 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"): 

Page 3: Sinal e Magnitude, Complementos a 1 e 2

------ 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 11 1001111 (+) 001111 (+) 110000 (-) 110000 (-)

+001010 (+) +010110 (+) +110101 (-) +101001 (-)011001 (+) 100101 (-) 100101 011001

+______1 +______1100110 (-) 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!

ARITMÉTICA EM COMPLEMENTO - SOMA EM COMPLEMENTO A DOISO 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;

Page 4: Sinal e Magnitude, Complementos a 1 e 2

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 111111 1____1001111 (+) 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!

ARITMÉTICA EM SINAL E MAGNITUDEEm 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; 

Page 5: Sinal e Magnitude, Complementos a 1 e 2

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 11

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 1011CORRETO 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 -> subtraimaior magnitude é positivo -> resultado é positivo

sinais contrários -> subtraimaior magnitude é negativo -> resultado é negativo

ambos negativos -> soma"vai-um" para bit de sinal -> overflow

Método sinal-e-magnitude

Sinal-e-magnitude de 8 bits

Binário com Sinal sem Sinal

00000000 +0 0

00000001 1 1

... ... ...

Page 6: Sinal e Magnitude, Complementos a 1 e 2

01111111 127 127

10000000 −0 128

10000001 −1 129

... ... ...

11111111 −127 255

A representação de sinal-e-magnitude ou sinal-magnitude é a mais familiar a nós que utilizamos o sistema numérico de base 10, usando um

sinal positivo ou negativo à esquerda do número para indicar se este é positivo ou negativo.[1] Pode-se primeiramente abordar o problema de

representar um sinal de número através da atribuição de um bit de sinal para representar o sinal: define-se esse bit(frequêntemente o bit mais

significativo) para 0 para representar um número positivo, e define-se como um para representar um número negativo. Os bits restantes do número

representam a magnitude (ou o valor absoluto). Assim, em um byte com 8 bits, são utilizados 7 bits para representar o valor e um bit para

representar o sinal. Neste caso, o valor pode variar de 0000000 (0) a 1111111 (127). Assim, pode-se representar números de −12710 a +12710,

uma vez que você adicione o bit de sinal (o oitavo bit). Uma conseqüência desta representação é que existem duas maneiras de representar o

zero, 00000000 (0) e 10000000 (-0).[2]

Esta abordagem é directamente comparável com a maneira comum de se mostrar um sinal (colocando um "+" ou "-" junto à magnitude do

número). Alguns dos primeiros computadores binários (por exemplo, o IBM 7090) usaram esta representação, talvez por causa de sua relação

natural com o uso comum.[carece de fontes] Sinal de magnitude é a forma mais comum de representar os significandos em valores de ponto flutuante.

Complemento para um

Complemento para um com 8 bits

Page 7: Sinal e Magnitude, Complementos a 1 e 2

Binário

Interpretação

de

complemento

para um

Interpretação

sem sinal

00000000 +0 0

00000001 1 1

... ... ...

01111101 125 125

01111110 126 126

01111111 127 127

10000000 −127 128

10000001 −126 129

10000010 −125 130

Page 8: Sinal e Magnitude, Complementos a 1 e 2

... ... ...

11111110 −1 254

11111111 −0 255

Como alternativa, um sistema conhecido como complemento para um oucomplemento de um pode ser usado para representar números

negativos. A forma de representar números negativos em "complemento para um" é aplicar a operação bitwise NOT para os números negativos

(com -), o seja, o complemento da sua contraparte positiva. Como na representação sinal de magnitude, o "complemento para um" tem duas

representações para o 0: 00000000 (+0) e 11111111 (-0). Na prática, este zero negativo, quando detectado é transformado em zero normal. [3]:p.17,18

Como exemplo, a forma em complemento para um de 00101011 (43) torna-se 11010100 (-43). O intervalo de números com sinal usando

complemento para um é representado por: −(2N−1−1) para (2N−1−1) e +/-0. Um byte de oito bits convencional é −12710 para +12710 com zero sendo

ou 00000000 (+0) ou 11111111 (-0).

Para adicionar dois números representados neste sistema, se faz uma adição binária convencional, mas é então necessário adicionar qualquer

"vai-um" resultante de volta para a soma resultante. Para ver por que isso é necessário, considere o seguinte exemplo que mostra o caso da

adição de −1 (11111110) a +2 (00000010).[2]:p.19

binário decimal 11111110 -1 + 00000010 +2 ............ ... 1 00000000 0 <-- não é a resposta correta 1 +1 <-- adiciono "vai-um" ............ ... 00000001 1 <-- resposta correta

No exemplo anterior, a adição binária somente dá 00000000, o que é um resultado incorreto. Somente quando o "vai-um" é adicionado de volta o

resultado correto (00000001) aparece.

Page 9: Sinal e Magnitude, Complementos a 1 e 2

Este sistema de representação numérica era comum em computadores mais antigos; o PDP-1, CDC 160A e a série UNIVAC 1100/2200, entre

muitos outros, utilizavam aritimética de "complemento para um".[carece de fontes]

Uma observação sobre ortografia: O sistema é conhecido como "complemento para um", porque a negação de um valor positivox(representado

como a operação bitwise NOT de x) pode também ser formado pela subtração de x da representação em "complemento para um" do número zero

que é uma longa seqüência de uns (-0). A aritmética de "Complemento de dois", por outro lado, constitui a negação de x subtraindo x a partir de

uma única grande potência de dois que é congruente a 0. [4] Por isso, a representação de "complemento para um" e a representação de

"complemento para dois" irão diferir de um.

Os protocolos Internet IPv4, ICMP, UDP e TCP usam todos o mesmo algoritmo checksum de 16 bits de complemento para um. Embora a maioria

dos computadores careça de um hardware para método de complementos, a complexidade extra é aceita porque "é igualmente sensível a erros

em todas as posições dos bits".[5] No UDP, a representação de zero com todos os bits setados para 0s indica que o recurso de verificação opcional

foi omitido. A outra representação, FFFF, indica um valor de checksum 0.[6] (Checksums são obrigatórios em IPv4, ICMP e TCP; eles foram

omitidos do IPv6).

Note que a representação de complemento para um de um número negativo pode ser obtida de uma representação sinal-e-magnitude

simplesmente fazendo-se uma operação de complemento bitwise da magnitude.[necessário esclarecer]

[editar]Complemento para dois

Complemento para dois de 8 bits

Binário

Interpretação

de

complemento

para dois

Interpretação

sem sinal

00000000 0 0

Page 10: Sinal e Magnitude, Complementos a 1 e 2

00000001 1 1

... ... ...

01111110 126 126

01111111 127 127

10000000 −128 128

10000001 −127 129

10000010 −126 130

... ... ...

11111110 −2 254

11111111 −1 255

Ver artigo principal: Complemento para dois

Page 11: Sinal e Magnitude, Complementos a 1 e 2

Os problemas de múltiplas representações de 0 e a necessidade de tratamento com "vai-um" são contornadas por um sistema

chamado complemento para dois.[2]:p.21Neste modelo, os números negativos são representados pelo padrão de bits que é maior em uma unidade

(no sentido sem-sinal) que o "complemento para um" do valor positivo.

Em complemento para dois, há apenas um zero (00000000). Se nega um número (negativo ou positivo) invertendo-se todos os bits e, em

seguida, adicionando 1 ao resultado. A adição de um par números em complemento para dois é o mesmo a adição de um par de números sem-

sinal . Por exemplo, um complemento para dois da adição de 127 e -128 dá o mesmo padrão de bits binário de uma adição sem sinal de 127 com

128, como pode ser visto na tabela acima.[2]:p.21

Um método mais fácil de obter a negação de um número em complemento de dois é o que se segue:

Exemplo 1 Exemplo 2

1. A partir da direita, encontre o primeiro '1' 0101001 0101100

2. Inverte todos os bits à esquerda deste

um1010111 1010100