Você está na página 1de 89

Arquitetura

Arquitetura de
de Computadores,
Computadores
Sistemas
e Sistemas
de Computação
Operativos
Informática2015/2016
de Gestão, ESTiG/IPB
José Rufino
baseado no livro “The Essentials of
2020/2021
Computer Organization and Architecture”
de Linda Null e Julia Lobur

Parte AC2
Representação de Dados
Objetivos

• entender os fundamentos da representação e


manipulação de dados num sistema de computação
• dominar as técnicas de conversão entre diferentes
sistemas de numeração
• compreender como ocorrem erros de computação
devido a truncagem e overflow
• entender os conceitos fundamentais da representação
em vírgula flutuante
• conhecer os principais códigos de caracteres
2
2.1 Introdução

• bit: unidade de informação básica num computador


– bit = contração de binary digit
– corresponde ao estado “on” ou “off” num circuito digital
– às vezes, esses estados correspondem a níveis “altos” ou
“baixos” de voltagem, em vez de “ligado” ou “desligado”

• byte: grupo de 8 bits (IBM System/360, 1964)


– a mais pequena unidade de armazenamento “endereçável”
– “endereçável”: significa que a informação pode ser acedida
(lida/escrita) com base na sua localização em memória

3
2.1 Introdução

• palavra (word): grupo contíguo de bytes


– as palavras podem ter qualquer número de bits ou bytes
– os tamanhos 16, 32 e 64 bits são os mais comuns
– num sistema “endereçável à palavra”, a palavra é a mais
pequena unidade de armazenamento possível de endereçar
• nibble (ou nybble): grupo contíguo de 4 bits
– os bytes são, portanto, constituídos por 2 nibbles:
• o mais significativo e o menos significativo
(grosso modo: o que tem mais/menos peso no valor do byte)

4
2.2 Sistemas de Numeração Posicionais

• um número é uma sequência de algarismos/dígitos (tb


designados por numerais), expresso numa certa base

• a base define o conjunto (alfabeto) de dígitos admissíveis


• base 10: 10 dígitos (0,1,2,...,9) - sist. decimal
• base 2: 2 dígitos (0,1) - sist. binário
• base 3: 3 dígitos (0,1,2) - sist. ternário
• base 8: 8 dígitos (0,1,...,7) - sist. octal
• base 16: 16 dígitos (0,1,...,9,A,B,C,D,E,F)
- sist. hexadecimal
5
2.2 Sistemas de Numeração Posicionais

• os Sistemas de Numeração Posicionais são também


conhecidos por Sistemas de Numeração Pesados:
– cada algarismo, ocupando uma certa posição num
número, é multiplicado por uma potência da base
• o algarismo atua como coeficiente da potência
– o valor das potências depende da posição dos dígitos

• a utilização da base como índice permite distinguir


números expressos em bases diferentes (101 0≠102)
– sem índice, a base 10 é assumida implicitamente
6
2.2 Sistemas de Numeração Posicionais

• 5836.471 0 como soma de produtos (de coeficientes


{0,1,…,9} por potências de 10) é:

5  10 3 + 8  10 2 + 3  10 1 + 6  10 0 + 4  10 -1 + 7  10 -2

• 11001.11 2 como soma de produtos (de coeficientes


{0,1} por potências de 2) é:

1  2 4 + 1  2 3 + 0  2 2 + 0  2 1 + 1  2 0 + 1  2 -1 + 1  2 -2 =
16 + 8 + 0 + 0 + 1 + 0.5 + 0.25 = 25.751 0
7
2.3 Conversão entre Sist. de Numeração
- Conversão de Números Naturais

• para já, consideramos apenas inteiros não-negativos


• a conversão entre sistemas pode fazer-se usando
– método da subtração repetida
• é o método mais intuitivo … mas exige alguma
familiarização com as potências da base alvo
• baseia-se na obtenção da expressão do número como
soma de potências da base para a qual se vai converter

– método da divisão com resto

8
2.3 Conversão entre Sistemas de Numeração
- Conversão de Números Naturais
- Método da Subtração
• converter 1901 0 para a base 3
– exprimir 190 como uma soma
de potências de 3, em que o
peso de cada potência só pode
ser 0, 1 ou 2 (alfabeto ternário)
– como 3 5 = 243, então o resul-
tado terá menos de 6 dígitos
– ora, para a potência 3 4 = 81,
tem-se 2 x 81 = 162 ≤ 190
– aproveita-se o 2 e subtrai-se
162 a 190, pelo que resta 28
9
2.3 Conversão entre Sistemas de Numeração
- Conversão de Números Naturais
- Método da Subtração
• converter 1901 0 para a base 3
– a próxima potência de 3
ainda não usada é 3 3 = 27
– o coeficiente/dígito 2 não se
pode usar pois 2 x 27 > 28
– o coeficiente/dígito 1 pode- -
se usar pois 1 x 27 ≤ 28 ;
aproveita-se o 1 e subtrai-se
27 a 28, pelo que resta 1
– a próxima potência de 3 (3 2
= 9) é demasiado grande,
pelo que o seu coeficiente 10
será 0; continua a sobrar 1
2.3 Conversão entre Sistemas de Numeração
- Conversão de Números Naturais
- Método da Subtração
• converter 1901 0 para a base 3
– a próxima potência de 3 (3 1
= 3), é demasiado grande,
pelo que o seu coeficiente
será 0; continua a sobrar 1
– para a última potência de 3
(30 = 1), o coeficiente/dígito
1 permite ter 1 x 30 = 1 ≤ 1 ;
aproveita-se o 1 e o resto é 0
– o resultado da conversão,
lido de cima para baixo, é:
19010 = 210013
11
2.3 Conversão entre Sistemas de Numeração
- Conversão de Números Naturais
- Método da Divisão

• é um método mais mecânico (e mais rápido)

• ideia base:

– sucessivas divisões pelo valor da base equivalem a


sucessivas subtrações de potências dessa base

– os restos obtidos durante o processo de divisão


correspondem aos dígitos/coeficientes pretendidos

12
2.3 Conversão entre Sistemas de Numeração
- Conversão de Números Naturais
- Método da Divisão
• converter 1901 0 para a base 3
– divisão do número a conver-
ter (190), pela base (3) para
a qual se pretende converter 190 |3
10 63 |3
1
– o processo termina quando 03 21 |3
o quociente for igual a 0 0
0 7 |3
1 2 |3
– o resultado da conversão, 2 0
lido de baixo para cima, é:
1901 0 = 210013 13
2.3 Conversão entre Sistemas de Numeração
- Conversão de Números Naturais
- Conversão da Base 10 para a Base 2

• tomando como referência o exemplo anterior, a


conversão da base 10 para a base 2 pode ser feita
usando os mesmos dois métodos apresentados
• Método da Subtração: é trivial, dado que cada
potência de 2 ou conta (coeficiente ou bit 1) ou
não conta (coeficiente ou bit 0), uma vez que o
alfabeto binário tem apenas dois símbolos (0,1)
• Método da Divisão: aplica-se a mesma lógica,
apenas com a diferença de que se divide por 2
• exercício: converter 190 da base 10 p/ a base 2
14
2.3 Conversão entre Sist. de Numeração
– Conversão de Valores Fracionários

• até aqui, estudou-se a conversão de inteiros


(não-negativos); aborda-se agora a conversão
de valores fracionários (igual/ não-negativos) ...
• valores fracionários têm uma parte inteira e uma
parte fracionária (por exemplo: 5836.47)
• ao contrário da parte inteira, a parte fracionária
pode não ter representação exata numa base
– exemplo: a quantidade ½ tem representação
exata no sistema binário e no sistema decimal,
mas não tem no sistema ternário (base 3)
15
2.3 Conversão entre Sist. de Numeração
– Conversão de Valores Fracionários

• valores decimais fracionários têm dígitos à direita


do ponto decimal; valores binários fracionários
têm dígitos à direita do ponto binário; etc ...

• à direita do ponto da base, os dígitos são coefici-


entes de potências negativas da base em causa:
0.471 0 = 4  10 -1 + 7  10 -2
0.112 = 1  2 -1 + 1  2 -2
= ½ + ¼
= 0.5 + 0.25 = 0.75
16
2.3 Conversão entre Sist. de Numeração
– Conversão de Valores Fracionários

• tal como para valores inteiros, existem dois métodos


de conversão: o da subtração e o da multiplicação

• método da subtração:
– idêntico ao aplicado para valores inteiros, mas ...
– … subtraem-se potências negativas da base alvo
• começa-se pela potência de expoente -1 (n - 1, para
a base n) e vai-se diminuindo o valor do expoente

17
2.3 Conversão entre Sistemas de Numeração
- Conversão de Valores Fracionários
- Método da Subtração
• conversão do decimal
0.81251 0 para binário

– o resultado da conversão,
lido de cima para baixo, é:
0.81251 0 = 0.11012

18
2.3 Conversão entre Sistemas de Numeração
- Conversão de Valores Fracionários
- Método da Multiplicação

• método da multiplicação:
– multiplica-se o valor fracionário original pela base
– no produto, o valor à esquerda do ponto (ou seja, a
parte inteira do produto) é o 1º dígito do número
– o valor à direita do ponto é nova/ multiplicado pela base
– no produto, o valor à esquerda do ponto é o 2º dígito
– ...
– o processo repete-se até que a parte à direita do ponto
seja zero (ou até se atingir uma precisão “suficiente”)

19
2.3 Conversão entre Sistemas de Numeração
- Conversão de Valores Fracionários
- Método da Multiplicação
conversão do decimal
0.81251 0 para binário:

– o primeiro dígito do número


pretendido em binário será 1

20
2.3 Conversão entre Sistemas de Numeração
- Conversão de Valores Fracionários
- Método da Multiplicação
conversão do decimal
0.81251 0 para binário:

– ignorando-se o valor das


unidades em cada passo,
continuar a multiplicar a parte
fracionária pelo valor da base

21
2.3 Conversão entre Sistemas de Numeração
- Conversão de Valores Fracionários
- Método da Multiplicação
conversão do decimal
0.81251 0 para binário:

– o processo termina quando o


produto for zero ou se atingir
o número desejado de dígitos

– o resultado da conversão, lido


de cima para baixo, é:
0.81251 0 = 0.11012

22
2.3 Conversão entre Sist. de Numeração
– Conversão expedita entre Bases 2, 8 e 16

• o sistema de numeração binário (base 2) é o +


importante no mundo dos computadores digitais

– os números binários são a base da representação


de dados em sistemas de computação digitais

– o conhecimento do sistema binário é essencial à


compreensão da operação dos componentes de
um computador, bem como para o desenho de
arquiteturas de conjuntos de instruções

23
2.3 Conversão entre Sist. de Numeração
– Conversão expedita entre Bases 2, 8 e 16

• no entanto, é difícil ler sequências longas de bits;


além disso, um valor decimal da ordem dos
milhares já produz uma sequência de bits longa
– por exemplo: 110101000110112 = 135951 0

• por razões de dimensão e facilidade de leitura,


valores binários são vulgarmente expressos no
sistema de numeração hexadecimal (base 16)
ou no sistema de numeração octal (base 8)

24
2.3 Conversão entre Sist. de Numeração
– Conversão expedita entre Bases 2, 8 e 16

• para converter de binário para hexadecimal, basta


agrupar os dígitos binários em grupos de 4 dígitos

[ um grupo de 4 dígitos binários é designado por hextet ]

• para converter de binário para octal, é suficiente


agrupar os dígitos binários em grupos de 3 dígitos

[ um grupo de 3 dígitos binários é designado por octet ]

25
2.3 Conversão entre Sist. de Numeração
– Conversão expedita entre Bases 2, 8 e 16

• usando grupos de 4 bits, a representação hexade-


cimal do valor binário 110101000110112 (= 1359510) é:

• valores em octal (base 8) são derivados dos


binários usando grupos de 3 bits (8 = 23):

26
2.3 Conversão entre Sist. de Numeração
– Tabela Auxiliar p/ Conversão entre Bases

n 2^n 3^n 4^n 5^n 6^n 7^n 8^n 9^n


-5 0,03125 0,0041152263 0,0009765625 0,00032 0,0001286008 0,000059499 3,05176E-005 1,69351E-005
-4 0,0625 0,012345679 0,00390625 0,0016 0,0007716049 0,0004164931 0,0002441406 0,0001524158
-3 0,125 0,037037037 0,015625 0,008 0,0046296296 0,0029154519 0,001953125 0,0013717421
-2 0,25 0,1111111111 0,0625 0,04 0,0277777778 0,0204081633 0,015625 0,012345679
-1 0,5 0,3333333333 0,25 0,2 0,1666666667 0,1428571429 0,125 0,1111111111
0 1 1 1 1 1 1 1 1
1 2 3 4 5 6 7 8 9
2 4 9 16 25 36 49 64 81
3 8 27 64 125 216 343 512 729
4 16 81 256 625 1296 2401 4096 6561
5 32 243 1024 3125 7776 16807 32768 59049
6 64 729 4096 15625 46656 117649 262144 531441
7 128 2187 16384 78125 279936 823543 2097152 4782969
8 256 6561 65536 390625 1679616 5764801 16777216 43046721
9 512 19683 262144 1953125 10077696 40353607 134217728 387420489
10 1024 59049 1048576 9765625 60466176 282475249 1073741824 3486784401

27
2.3 Conversão entre Sist. de Numeração
– A memorizar !!!

checkpoint:
exercícios 2.1 a 2.4

28
2.3.1 Adenda
- Gama de Representação na Base 2 s/ Sinal

• para número inteiros binários sem sinal (i.e., >=0)


expressos com N bits, a gama de representação é:

{ 0, … , 2 N – 1 }
• exemplos:
– para N=8 bits
{ 0, … , 2 8 – 1 } = { 0, … , 255 }

– para N=7 bits

{ 0, … , 2 7 – 1 } = { 0, … , 127 }
29
2.3.1 Adenda
- Aritmética Decimal e Aritmética Binária
• a aritmética binária é semelhante à aritmética decimal
(nota: veremos apenas exemplos com duas parcelas)
• adição decimal: 1 1

– se a soma de uma coluna é


>= 10, haverá transporte …
– transporte => somar 1 unidade à próxima coluna
• adição binária:
– regras bit-a-bit → <=> 1 + 1 = 10

1 1 1
– exemplo →
30
2.3.1 Adenda
- Aritmética Decimal e Aritmética Binária
• subtração decimal: 1 1 1

– numa coluna, se subtraendo >


minuendo, haverá empréstimo
– empréstimo => somar 1 ao subtraendo da próx. coluna

• subtração binária: 0
0
– regras bit-a-bit → 1
1 empresta 1

– exemplo → 1 1

0
31
2.4 Representação de Inteiros com Sinal

• até agora, apenas consideramos números >=0


• para representar números inteiros com sinal (+/-),
os sistemas de computação reservam o bit mais
significativo do número para indicar o seu sinal
– bit mais significativo: “o que se encontra mais à esquerda”
• os restantes bits representam o valor do número
S V V V V V ... V
• as representações c/ sinal mais relevantes são:
– representação “sinal e magnitude”
– representação “complemento para um”
– representação “complemento para dois” 32
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• bits à direita do bit de sinal: correspondem à repre-


sentação binária da magnitude/módulo do número
• gama representável com N = 1 + (N-1) bits
{ - (2 N - 1– 1), … , - 0, +0, … , (2 N - 1– 1) }
• exemplo: numa palavra de N=8 bits, na representação
em sinal e magnitude, o valor absoluto é colocado nos
N-1 = 7 bits menos significativos (à direita do sinal)
– +3 será representado como 00000011
– - 3 será representado como 10000011
– gama representável: { - 127, … , -0, +0, … , 127 }
33
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• generalização: para inteiros de N bits, o negativo de


um positivo obtém-se somando-lhe a sequência de N
bits em que o bit à esquerda é 1 e o outros são zeros
– confirmar isto para o exemplo da página anterior ...
• regras da adição para “sinal e magnitude”:
– sinais iguais
• somar as magnitudes e reutilizar o sinal comum
– sinais diferentes
• o sinal do resultado é o do operando de maior magnitude
• a magnitude do resultado obtém-se subtraindo o menor
operando ao maior operando 34
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• usando a aritmética de sinal e


magnitude, somar 75 com 46

– converter 75 e 46 para a base


2 e organizar as parcelas com
a separação do bit do sinal

– tal como na aritmética decimal,


começar pelo bit mais à direita
e avançar para a esquerda

35
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• usando a aritmética de sinal e


magnitude, somar 75 com 46

– no segundo bit, como 1+1=10,


há lugar ao transporte de um
bit, anotado por cima do terceiro

– para o terceiro e quarto bits


procede-se de forma similar

36
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• usando a aritmética de sinal e


magnitude, somar 75 com 46

– a operação termina depois de


processados todos os bits

Note-se que na aritmética de sinal e magnitude


o bit de sinal é processado à parte !...

Neste exemplo, os valores foram escolhidos de


forma a garantir que a soma fosse representável em
7 bits. Se tal não acontecer, haverá um problema →

37
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• usando a aritmética de sinal e


magnitude, somar 107 com 46

– sobra o bit que deveria ser


transportado ao somar a 7ª
coluna, i.e., ocorre overflow
• pois o bit de sinal não pode
receber o bit de overflow (o
resultado seria negativo !)

– obtém-se assim um valor


errado: 107 + 46 = 25
38
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• usando a aritmética de sinal e


magnitude, somar -46 com -25
111

– os sinais são iguais: é apenas


necessário somar as magni-
tudes e manter o bit do sinal

39
2.4 Representação de Inteiros com Sinal
- Sinal e Magnitude

• usando a aritmética de sinal e


magnitude, somar 46 com -25
1 1

– os sinais são diferentes 0 0101110


1 - 0011001
– o sinal do resultado será +, pois é 0 0010101
o sinal do maior operando (46)
– subtrai-se o menor operando (25)
ao maior operando (46)
– no 1º bit há lugar ao empréstimo
de um bit, anotado por cima do 2º;
o mesmo ocorre entre o 5º e o 6º

40
2.4 Representação de Inteiros com Sinal
- Sistemas de Complemento

• a representação em “sinal e magnitude” é simples


para os humanos, mas requer hardware complexo

• outra desvantagem dessa representação é o facto


de ser possível representar o número 0 de duas
maneiras diferentes (o 0 positivo e o 0 negativo)

• pelas razões acima, os Sistemas de Computação


utilizam representações “em complemento”
41
2.4 Representação de Inteiros com Sinal
- Sistemas de Complemento à Base
• facto, no sistema decimal:
– seja A = minuendo – subtraendo, B = [ “tudo a
noves” - subtraendo ], C = [ minuendo + B ] e
D = [ transporte de C ] ; então, A = C + D

• exemplo: A = 167- 52
– B = 999 – 52 = 947 (complemento para 9 de 52)
– C = 167 + B = 167 + 947 = 114, com D = 1
– A = C + D = 1 + 114 = 115 = 167- 52 !!
– ou seja: -52 (<0) foi representado como 947 (>0)
42
2.4 Representação de Inteiros com Sinal
- Sistemas de Complemento à Base

• generica/ as representações em complemento:


– representam número negativos recorrendo a uma
diferença do seu módulo em relação à sua base

– permitem transformar subtrações em somas


• uma diferença entre dois valores é obtida soman-
do ao minuendo o complemento do subtraendo

– permitem dispensar hardware para a subtracção

• esta técnica é também aplicável ao sistema binário


43
2.4 Representação de Inteiros com Sinal
- Complemento à Base Menos Um
• no “complemento à base menos um”, um número
negativo é dado pela diferença entre [a sua base
subtraída de uma unidade] e [o seu valor absoluto]
• no caso da base 10, o complemento para 9
representa o “complemento à base menos um”
• no caso da base 2, o “complemento à base
menos um” é dado pelo “complemento para 1”
– exemplo: o complemento para 1 de 01012 é, pelo
método já antes usado, 1111 2 – 01012 = 10102
– na prática, o complemento para 1 de um número
binário é obtido negando/trocando os seus bits
44
2.4 Representação de Inteiros com Sinal
- Complemento para Um
• na base 2, o “complemento para 1” suporta a
seguinte representação de inteiros com sinal:
– número positivo: não é sujeito a qualquer conversão;
o valor obtém-se pela leitura direta da representação
– número negativo: resulta da conversão do módulo
desse número para “complemento para 1”; logo:
• para saber que número >0 corresponde a um número
negativo tem de se calcular o seu complemento para 1
• exemplo (com números de 8 bits):
– +3 será, em complemento para 1: 00000011
– - 3 será, em complemento para 1: 11111100
– - 3 será, em “sinal e magnitude”: 10000011 45
2.4 Representação de Inteiros com Sinal
(*) - Aritmética em Complemento para Um

• somar 48 com -19


– 481 0 = 001100002,
191 0 = 00010011 2 11101100

– o complemento para 1 de
00010011 2 é 111011002
– a adição dá origem a um
bit de transporte final, que 000111012= 291 0= 48 – 19
é adicionado ao resultado
Note-se que o bit de sinal faz agora parte dos cálculos (i.e., não
é preciso processá-lo à parte), e pode ser modificado por estes.
[ o mesmo irá acontecer na aritmética em complemento para 2 ] 46
2.4 Representação de Inteiros com Sinal
(*) - Aritmética em Complemento para Um

• somar 19 com - 48
– 191 0 = 00010011 2, 11111
481 0 = 001100002 00010011
+ 11001111
– o complemento para 1 de 11100010
001100002 é 11001111 2
– a adição dá origem a um
número negativo (-29)
1
111000102 → 000111012=
– o valor absoluto obtém-
se do complemento p/ 1 = 291 0= | 19 – 48 |

47
2.4 Representação de Inteiros com Sinal
- Complemento para Um

• apesar da sobrecarga imposta pelo tratamento do


bit de transporte, o “complemento para um” é mais
simples de implementar que o “sinal e magnitude”
• porém, continua a haver duas representações
possíveis para o número zero (00 ...0 e 11...1)
– donde, na prática, a gama de representação é a
mesma que a suportada em “sinal e magnitude”
– o “complemento para dois” resolve o problema
• o “complemento para dois” é o “complemento à
base” de facto do sistema de numeração binário
48
2.4 Representação de Inteiros com Sinal
- Complemento para Dois

• na base 2, o “complemento para 2” suporta a


seguinte representação de inteiros com sinal:
– número >0: basta fazer a conversão para binário
– número <0: adicionar 1 ao complemento para 1

• exemplo (com 8 bits):


– +3 é, em complemento para 2: 00000011
– - 3 é, em complemento para 1: 11111100
– - 3 é, em complemento para 2: 11111101

49
2.4 Representação de Inteiros com Sinal
(*) - Aritmética em Complemento para 2
• na aritmética de complemento para dois, somam- -
se os valores binários e ignora-se qualquer bit de
transporte produzido nos bits mais significativos
• somar 48 com -19 11101100
+ 1
– 481 0= 001100002, 11101101
191 0= 00010011 2
– o complemento para 1 de
00010011 2 é 111011002
11101101
– o complemento para 2 de
00010011 2 é 111011012
– agora, o bit de transporte final, 000111012=
não é adicionado ao resultado 291 0= 48 – 19
50
2.4 Representação de Inteiros com Sinal
(*) - Aritmética em Complemento para 2
1111
• somar 19 com - 48 11001111
+ 1
– 191 0 = 00010011 2,
11010000
481 0 = 001100002
– o complemento para 1 de 1
001100002 é 11001111 2 00010011
– o complemento para 2 de + 11010000
001100002 é 110100002 11100011

– não há bit de transporte final 1


11100011 → 00011100
– a adição dá um número <0
00011100
– para saber o seu valor absolu- + 1
to, convertê-lo para comp. p/ 2 00011101=2910 51
2.4 Representação de Inteiros com Sinal
(*) - Deteção de Overflow em Comp. p/ 2

• quando se usa um número finito de bits para


representar um número, corre-se o risco de o
resultado de um cálculo ser demasiado grande
(overflow) para ser armazenado no computador
• overflow em complemento para 2:
– quando a soma de números positivos é negativa
– quando a soma de números negativos é positiva
– a soma de um número positivo com um número
negativo nunca origina uma situação de overflow

52
2.4 Representação de Inteiros com Sinal
(*) - Deteção de Overflow em Comp. p/ 2

• apesar de não ser possível prevenir casos de


overflow, pode-se detetar a sua ocorrência
• na aritmética de complemento para 2, a
situação de overflow é fácil de detetar :

se o transporte que entra no bit de sinal for


diferente do transporte que sai, há overflow

53
2.4 Representação de Inteiros com Sinal
(*) - Deteção de Overflow em Comp. p/ 2

• exemplo: somar 107 com 46

– o bit de transporte proveniente da


7ª coluna de bits e que entra na
8ª coluna (bit de sinal) é 1
– o bit de transporte que sai da 8ª
coluna (bit de sinal) é 0
– logo, é porque há overflow ...
– de facto, o complemento para 2
de 10011001 é 01100110 = 10310
donde 107 + 46 = - 103 !!
54
2.4 Representação de Inteiros com Sinal
- Gamas de Representação (Resumo)

• gama representável com N = 1 + (N-1) bits


– sinal e magnitude, complemento para 1
{ - (2 N - 1– 1), … , - 0, +0, … , (2 N - 1– 1) } checkpoint:
– complemento para 2 exercícios 2.5 a
2.7, 2.16, 2.17
{ - 2 N - 1, … , 0, … , (2 N - 1– 1) }
• exemplo: N=4 bits : { -8, ..., 0, ..., 7}
• representação dos zeros
– sinal e magnitude: 0 0...0 (+0) ; 1 0...0 (-0)
– complemento para 1: 0 0...0 (+0) ; 1 1...1 (-0)
– complemento para 2: 0 0...0
55
2.5 Representação em Vírgula Flutuante

• as representações em “sinal e magnitude”,


“complemento para 1” e “complemento
para 2” apenas permitem manipular inteiros

• sem modificação, estes formatos não são


úteis em aplicações científicas que neces-
sitem de usar valores numéricos reais

• solução: representação em vírgula flutuante


56
2.5 Representação em Vírgula Flutuante

• com algum esforço adicional de programação,


pode-se efetuar cálculos em vírgula flutuante
usando apenas formatos inteiros
• a isto chama-se “emulação de vírgula flutuante”,
visto que os valores em vírgula flutuante não são
armazenados como tal; o software faz crer que
estão a ser usados valores em vírgula flutuante
• no entanto, a maioria dos computadores atuais
possuem hardware dedicado para a realização de
cálculos aritméticos em vírgula flutuante
57
2.5 Representação em Vírgula Flutuante

• valores em vírgula flutuante podem ter um núm.


arbitrário de dígitos à direita do ponto decimal
– por exemplo: 0.5  0.25 = 0.125

• normalmente os valores em vírgula flutuante


são representados usando notação científica
– por exemplo:

0.125 = 1.25  10-1

5000000 = 5.0  106

58
2.5 Representação em Vírgula Flutuante

• os computadores usam uma espécie de notação


científica para a representação em vírgula flutuante
• em notação científica, os números possuem três
componentes: sinal, mantissa e expoente (de 10)

59
2.5 Representação em Vírgula Flutuante

• num computador, a representação de um número


em vírgula flutuante tem três campos de tamanho
fixo: sinal, expoente (de 2) e significando

• esta é a disposição standard para esses campos

60
2.5 Representação em Vírgula Flutuante

• o campo do sinal corresponde a um único bit


• o tamanho do campo do expoente determina a
gama de valores que podem ser representados
• o tamanho do campo do significando determina
a precisão da representação

61
2.5 Representação em Vírgula Flutuante

• norma IEEE-754 para vírgula flutuante


– precisão simples: 1+31 bits
• 8 bits para o expoente, 23 bits para o significando
– precisão dupla: 1+63 bits
• 11 bits para o expoente, 52 bits para o significando

para ilustração de conceitos será usado um modelo


de 14 bits (expoente de 5 bits; significando de 8 bits)
62
2.5 Representação em Vírgula Flutuante

• o significando de um número é sempre precedido


por um ponto binário implícito

o significando representa sempre um valor
binário fracionário (i.e., menor que 1)
• o expoente indica a potência de 2 que deve ser
multiplicada pelo significando

63
2.5 Representação em Vírgula Flutuante

• exemplo: representar 321 0 no modelo de 14 bits


– para tal, fazer flutuar a vírgula/ponto o necessário,
até que o significando seja fracionário (i.e., < 1)
– em notação científica binária tem-se 3210 =
1000002 x 20 = 10000.02 x 21= … = 10.00002 x 24
= 1.000002 x 25 = 0.1000002 x 26 = 0.12 x 26
– usando esta informação, coloca-se 110 (= 610) no
campo do expoente e 1 no campo do significando

64
2.5 Representação em Vírgula Flutuante
- Normalização

• problema: são possíveis


várias representações 0.1 x 26

para o mesmo número


– desperdício de espaço 0.01 x 27
e fonte de confusão

0.001 x 28
• exemplo: as ilustrações à
direita são todas represen- 0.0001 x 29
tações válidas do valor 32

65
2.5 Representação em Vírgula Flutuante
- Normalização
• solução: normalização - o problema das represen-
tações sinónimas resolve-se estabelecendo a regra
de que o 1º dígito do significando tem que ser 1,
resultando daí um padrão único para cada valor
6
– portanto, para o exemplo anterior, tem-se 321 0 = 0.12x2
– na norma IEEE-754, este 1 é assumido implicitamente a
seguir ao ponto binário, dispensando-se a sua representação
• essa assumpção permite maior precisão da representação

no modelo de 14 bits não serão usados bits implícitos

66
2.5 Representação em Vírgula Flutuante
- Notação em Excesso
• problema: como representar expoentes negativos ?
(e.g., como representar 0.062510 = 0.0001 = 0.12 x 2 -3 ?)

• solução1: no expoente, reservar um bit para o sinal


– mas há outra solução, mais eficiente em hardware

• solução2: notação em excesso


– os expoentes são guardados como números >=0
– para obter o verdadeiro valor de um expoente, é
necessário subtrair-lhe um deslocamento (bias)
67
2.5 Representação em Vírgula Flutuante
- Notação em Excesso

• solução2: notação em excesso (cont.)


– o deslocamento (bias) é um número que se encontra
aproximadamente a meio da gama de números que
seria usada para representar expoentes positivos
– números menores que o deslocamento representam
expoentes negativos, usados p/ números fracionários

no modelo de 14 bits (5 para o expoente) será usado um


deslocamento de 16 (representação em excesso-16):
- com 5 bits, o expoente pode ir de 0 até 31
- mais ou menos a meio dessa gama encontra-se o 16

68
2.5 Representação em Vírgula Flutuante
- Notação em Excesso

• exemplo1: representar 3210 (que é 25) no


modelo simplificado de 14 bits em excesso-16
– em not. científica binária normalizada 3210 = 0.12x26
– significando = 100000002 (com 8 bits)
– expoente = 6 + 16 = 221 0 = 101102 (com 5 bits)
– graficamente:

69
2.5 Representação em Vírgula Flutuante
- Notação em Excesso

• exemplo2: representar 0.062510 (que é 2-4) no


modelo simplificado de 14 bits em excesso-16
– em not. científica binária normalizada tem-se
0.062510 = 0.00012 x 20 =…= 0.012 x 2-2 = 0.12 x 2 -3

– significando = 100000002 (com 8 bits)


– expoente = -3 + 16 = 1310 = 011012 (com 5 bits)
– graficamente:

70
2.5 Representação em Vírgula Flutuante
- Notação em Excesso

• exemplo3: representar -26.62510 no modelo


simplificado de 14 bits em excesso-16
– sabendo-se que 26.62510 = 11010.1012, após a
normalização tem-se 26.62510 = 0.110101012 x 2 5
– significando = 110101012 (com 8 bits)
– expoente = 5 + 16 = 2110 = 101012 (com 5 bits)
– como -26.625 < 0, coloca-se a 1 o bit do sinal
– graficamente:

71
2.5 Representação em Vírgula Flutuante

• norma IEEE-754 para vírgula flutuante


– precisão simples (8 bits para expoente)
• usa um deslocamento de 127 (=2 7-1)
• o expoente 255 traduz valores especiais
– se o significando for 0, o valor será  infinito
– se o significando for diferente de 0, o valor será NaN
(“not a number”), usado normalmente para indicar erros

– precisão dupla (11 bits para expoente)


• usa um deslocamento de 1023 (=2 10-1)
• o valor especial do expoente é 2047

72
2.5 Representação em Vírgula Flutuante

• representação do valor zero

– quer o nosso modelo de 14 bits, quer a norma IEEE- -


754 permitem duas representações para o valor 0
• zeros no expoente e no significando, e 0 ou 1 no sinal

– logo, os programadores devem evitar comparações


(de valores em vírgula flutuante) com o valor 0
• o zero negativo é diferente do zero positivo !

73
2.5 Representação em Vírgula Flutuante
- Aritmética em Vírgula Flutuante

• a adição e a subtração em vírgula flutuante usam


métodos análogos aos dos humanos
• inicialmente, expressam-se os dois operandos com o
mesmo expoente; se for necessário, desnormaliza-se
um dos operandos (o de menor valor absoluto)
• mantendo o expoente, adicionam-se os significandos
• se a soma dos significandos gerar transporte (1) na
coluna do bit mais significativo, o transporte entra
pela esquerda no significando (que perde o bit menos
significativo) e o expoente é somado uma unidade
74
2.5 Representação em Vírgula Flutuante
- Aritmética em Vírgula Flutuante
• exemplo (s/ transporte): somar 121 0 com 1.251 0 expressando
as parcelas no modelo simplificado de 14 bits em excesso-16
– 121 0 = 0.11002 x 2 4
– 1.251 0 = 0.1012 x 2 1 = 0.0001012 x 2 4
– expoente = 4 + 16 =
20 = 101002

– a soma será
0.1101012 x 2 4

75
2.5 Representação em Vírgula Flutuante
- Aritmética em Vírgula Flutuante
• exemplo (c/ transporte): somar 0.51 0 a si próprio expressando
as parcelas no modelo simplificado de 14 bits em excesso-16
– 0.51 0 = 0.12 x 2 0
– expoente = 0 + 16 = 16 = 100002
– soma: 10
| 0 | 10000 | 10000000 |
+ | 0 | 10000 | 10000000 |
| 0 | 10000 | 00000000 |
– acerto: +1 | 10000000 | 0
| 0 | 10001 | 10000000 | =
0.12 x 2 17-16 = 0.12 x 2 1 = 1.02 x 2 0 = 110 76
2.5 Representação em Vírgula Flutuante
- Erros de Representação
• independentemente do número de bits usado na
representação em vírgula flutuante, o modelo em
causa tem uma capacidade finita de representação
• o universo de números reais é infinito; portanto,
qualquer modelo de representação oferecerá
apenas aproximações dos valores reais
• em algum ponto, todos os modelos acabam por
falhar introduzindo erros nos cálculos
• aumentando o número de bits do modelo, reduzem-
se esses erros, mas nunca se eliminam por completo

77
2.5 Representação em Vírgula Flutuante
- Erros de Representação
• o objetivo é reduzir os erros ou, pelo menos, ter
alguma ideia da magnitude dos erros nos cálculos
• exemplo:
– no modelo de 14 bits, não é possível representar
com exatidão o valor decimal 128.5, pois seriam
necessários 9 bits no significando: 128.51 0 = 10000000.12
– quando se tenta representar 128.51 0 no modelo de 14
bits, perde-se o bit menos significativo e produz-se
um erro relativo de (128.5 -128) / 128.5 = 0.39%
• é ainda necessário levar em conta que os erros se
podem acumular ao longo de repetidas operações
78
2.5 Representação em Vírgula Flutuante
- Erros de Representação
• exemplo: se, repetidamente, se adicionasse 0.5 a
128.5, haveria um erro de 2% ao fim de 4 iterações
– [(128.5+0.5+0.5+0.5+0.5)-(128)] / 130.5 = 1.9%
• os erros podem ser minimizados quando se usam
operandos com magnitudes similares ou próximas:
– para adicionar repetidamente 0.5 a 128.5, será melhor
adicionar 0.5 a si próprio e adicionar o resultado a 128.5
– 0.5+0.5+0.5+0.5=2; 2 + 128.5 = 130 (perde-se 0.5,
logo o erro relativo seria (130.5 – 130)/130.5 = 0.38%)
• nestes exemplos, o erro surge pela perda do bit (-)
significativo; a perda do (+) significativo seria pior !
79
2.5 Representação em Vírgula Flutuante
- Erros de Representação

• Devido à truncagem de bits, nem sempre se pode


assumir que uma operação em vírgula flutuante é
comutativa ou distributiva, ou seja, que
(a + b) + c = a + (b + c)
a*(b + c) = ab + ac
• Para testar se um valor em virgula flutuante é igual a
outro, pode-se usar um grau de aproximação epsilon:
if (abs(x)-abs(y)) < epsilon) then ...

80
2.5 Representação em Vírgula Flutuante
- Erros de Representação
• o overflow e o underflow em vírgula flutuante podem
levar os programas a terminar abruptamente
• ocorre overflow quando não há espaço para guardar
os bits + significativos que resultam de um cálculo
• ocorre underflow quando um número é demasiado
pequeno para ser armazenado; uma situação deste
tipo pode resultar numa tentativa de divisão por zero

Reflexão: é melhor que um


checkpoint:
programa termine abrupta-
mente, ou que produza exercícios 2.18, 2.20, 2.*1
resultados incorretos ?
81
2.6 Códigos de Caracteres

• os valores numéricos codificados em binário


terão pouco utilidade se não forem apresen-
tados de forma percetível aos utilizadores
• assim, os “caracteres compreendidos pelos
humanos” têm de ser convertidos para “padrões
de bits compreendidos pelos computadores”
usando esquemas de codificação de caracteres
• o ASCII (American Standard Code for Information
Interchange), de 7 bits, e o Unicode, de 16 bits,
são os códigos de caracteres mais usados atual/
82
2.6 Códigos de Caracteres
- ASCII

• 32 caracteres de controlo (NUL, SOH, ...), 10 dígitos (0-9),


52 letras (a-zA-Z), 32 caracteres especiais ($, #, ...), espaço
• 8º bit usável como bit de paridade para deteção de erros (pouco
usado hoje em dia), ou para codificar caracteres especiais (ç,ã,...)
83
2.6 Códigos de Caracteres
- Bit(s) de Paridade
• a forma mais básica de deteção de erros
• bit de paridade par (even parity):
– 1 se (“número de 1s do conjunto” + 1) for par
• bit de paridade ímpar (odd parity):
– 1 se (“número de 1s do conjunto” + 1) for ímpar
8 bits (incluindo bit de paridade)
7 bits de dados
(número de 1s) paridade
paridade PAR
ÍMPAR
0000000 (0) 0 0000000 1 0000000
1010001 (3) 1 1010001 0 1010001
1101001 (4) 0 1101001 1 1101001
1111111 (7) 1 1111111 0 1111111
84
2.6 Códigos de Caracteres
- Unicode
• o código ASCII assenta no alfabeto latino, usado
por uma minoria da população mundial ...
• muitos dos sistemas atuais optaram pelo Unicode,
um sistema de 16 bits que permite codificar os
caracteres de qualquer linguagem
– a linguagem Java e alguns sistemas operativos usam
o Unicode como código de caracteres por omissão
• o espaço de codificação do Unicode divide-se em
6 partes; a primeira parte destina-se aos alfabetos
ocidentais, incluindo Latino, Grego e Cirílico

85
2.6 Códigos de Caracteres
- Unicode
• apresenta-se à direita
o espaço de codifica-
ção Unicode →
– os caracteres Unicode
de numeração + baixa
incluem o código ASCII
– os de numeração + alta
permitem a definição de
códigos próprios

checkpoint:
exercícios 2.24 a 2.26
86
Conclusões
• os computadores armazenam dados na forma de
bits, bytes e palavras, usando o sistema binário
• números em hexadecimal são formados usando
grupos de 4 bits
• os inteiros com sinal podem ser armazenados
em sinal e magnitude, complemento para um,
e complemento para dois
• os números em vírgula flutuante são codificados
segundo a norma IEEE 754
• os caracteres são armazenados usando ASCII,
EBCDIC ou Unicode
87
Referências

• livro ECOA – Capítulo 2

• http://en.wikipedia.org/wiki/Binary_numeral_system

• http://en.wikipedia.org/wiki/Octal

• http://en.wikipedia.org/wiki/Hexadecimal

• http://en.wikipedia.org/wiki/Signed_number_representations

• http://en.wikipedia.org/wiki/One%27s_complement

• http://en.wikipedia.org/wiki/Two%27s_complement

• http://en.wikipedia.org/wiki/Floating-point_arithmetic

• http://en.wikipedia.org/wiki/IEEE_754-2008

• http://en.wikipedia.org/wiki/Unicode

• http://en.wikipedia.org/wiki/Ascii

• http://en.wikipedia.org/wiki/Binary-coded_decimal

• http://en.wikipedia.org/wiki/Ebcdic 88
Referências

• http://en.wikipedia.org/wiki/Unicode
• http://en.wikipedia.org/wiki/Ascii
• http://en.wikipedia.org/wiki/Binary-coded_decimal
• http://en.wikipedia.org/wiki/Ebcdic

89

Você também pode gostar