Arquitectura de Computadores
Notas de estudo
Alberto José Proença
1998/99
Anexo A : Representação de
inteiros
1.
Binário puro
NOTA:Ver secções 4.1 e 4.2 do livro
Os
números podem ser representados em qualquer base. Normalmente usamos base 10
(por isso usamos 10 dígitos diferentes). Os computadores pelo facto de só
conhecerem dois valores 0 e 1, são máquinas binárias, e por isso que trabalham
em base 2 (binário).
Para
compreender o que significa a base em que os números são representados é
necessário entender o significado da ordem dos dígitos. A ordem de um dígito
dentro de um número é dada pela posição que esse dígito ocupa no número, sendo
que a ordem do dígito menos significativo é 0. A base utilizada determina o
número de dígitos que podem ser utilizados. Base 10 utiliza 10 dígitos (0 a 9),
base 2 utiliza 2 dígitos (0 e 1), base 16 utiliza 16 dígitos (0 a 9, e, A a F).
Exemplo
Número:
1532
Algarismo
2 - ordem 0
Algarismo 3 - ordem 1
Algarismo 5 - ordem 2
Algarismo 1 - ordem 3
O
valor do número (escrito na base b) obtém-se multiplicando cada
dígito pela base b elevada à ordem do dígito e somando todos
estes valores.
Exemplo
Número:
15326 (base 6)
1 * 63
+ 5 * 62 +3 * 61 +2 * 60 = 41610
Número:
153210 (base 10)
1 * 103
+ 5 * 102 +3 * 101 +2 * 100 = 153210
Número:
153213 (base 13)
1 * 133 + 5 * 132 +3 * 131
+2 * 130 = 308310
Podemos
agora converter alguns números escritos em binário para base 10.
Exemplo
Número:
1101102
1 * 25
+ 1 * 24 + 0 * 23 + 1 * 22 + 1 * 21
+ 0 * 20 = 5410
Para
converter de base decimal para base binária divide-se sucessivamente por 2 e
tomam-se os restos e o último quociente.
Exemplo
Número:
23510
235/2 = 117 |
Resto = 1 |
/* bit menos
significativo */ |
117/2 = 58 |
Resto = 1 |
|
58/2 = 29 |
Resto = 0 |
|
29/2 = 14 |
Resto = 1 |
|
14/2 = 7 |
Resto = 0 |
|
7/2 = 3 |
Resto = 1 |
|
3/2 = 1 |
Resto = 1 |
/* bit mais
significativo */ |
23510
= 111010112
Para
adicionar números em binário ver secção 4.3 do livro.
Os
processadores utilizam um determinado número de bits para representar
um número. A quantidade de bits utilizados determina a gama de valores
que podem ser representados. Em binário puro podem-se escrever 2n
números, sendo n o número de bits utilizados. O maior
inteiro que pode ser representado depende, portanto, do tamanho da palavra em
cada processador. Surge assim o problema de somar dois inteiros e obter um
número maior do que aquele que a máquina pode representar. Esta situação é
normalmente designada por overflow e deve ser tomada em consideração
quer pelos programadores, quer pelos desenhadores de microprocessadores (ver
pág. 176 do livro).
A base
hexadecimal (16) é frequentemente utilizada pelos programadores porque é
bastante fácil converter de binário para hexadecimal (e vice-versa) e porque é
bastante mais fácil ler um número em hexadecimal do que em binário.
São
utilizados 16 dígitos: 0, 1, ..., 9, A, B, C, D, E, F.
Exemplo
Representar
431210 em hexadecimal.
4312 / 16 = 269 |
Resto = 8 |
|
269 / 16 = 16 |
Resto = 13 (Dígito D) |
|
16 / 16 = 1 |
Resto = 0 |
|
1 / 16 = 0 |
Resto = 1 |
|
Logo
431210 = 10D816
Exemplo
Representar
2AF316 em decimal.
2 * 163
+ 10 * 162 + 15 * 161 + 3 * 160 = 1099510
Nota:
A = 10, F = 15.
A
motivação para usar hexadecimal é a facilidade com que se converte entre esta
base e binário. Cada dígito hexadecimal representa um valor entre 0 e 15. Cada
conjunto de 4 bits representa também um valor no mesmo intervalo. Então
podemos converter aos grupos de 4 bits.
Exemplo
1
2 A F
(hexadecimal)
0010 1010 1111 (binário)
ou,
2AF16
= 0010101011112
Exemplo
2
1101 0101 1011 (binário)
D 5 B
(hexadecimal)
ou,
1101010110112
= D5B16
NOTA:
Ver secção 4.2 do livro
Os
computadores lidam com números positivos e números negativos, logo é necessário
encontrar uma representação para números com sinal negativo. Uma possibilidade
é inverter todos os bits de um número para representar o número
correspondente com sinal negativo. Esta representação é designada por complemento
para um .
Exemplo
10010
= 011001002 utilizando 8 bits
Invertendo
todos os bits obtemos:
-10010
= 100110112
O
problema desta representação é que existem 2 padrões de bits para o 0.
Nomeadamente 010 = 000000002 = 111111112. A
solução encontrada consiste em representar os números em complemento
para 2 . Para determinar o negativo de um número negam-se todos os
seus bits e soma-se uma unidade.
Exemplo
10010
= 011001002 utilizando 8 bits
Invertendo
todos os bits obtemos:
100110112
Somando
uma unidade : 100110112 + 1 = 100111002 = -10010
A
representação em complemento para 2 tem as seguintes características:
Exemplo
Qual o
número representado por 111001002 ?
Como o
bit da esquerda é 1 este número é negativo.
Vamos inverter:
000110112
Somando uma unidade :
000110112 + 1 = 000111002 = 2810
Logo
111001002 = - 2810
NOTA:
Ver secção 4.2 do livro
para detalhes sobre adição, subtracção e overflow.
Como é
que podemos converter um número representado em complemento para 2 com n bits
para um número representado com mais bits? Resposta: basta fazer a
extensão do sinal! Se o número é positivo acrescenta-se 0's à esquerda, se o
número é negativo acrescenta-se 1's à esquerda.
Exemplo
Representar
os seguintes números com 16 bits.
0011101010
Positivo, logo:
0000000011101010
11011110
Negativo, logo:
1111111111011110
A
multiplicação e a divisão têm algoritmos algo complexos que ultrapassam o
âmbito destas notas de estudo. No entanto a divisão e multiplicação por
potências de 2 realizam-se efectuando shifts à direita ou à esquerda,
respectivamente.
Fazer
o shift à esquerda uma vez de um número binário corresponde a
multiplicar por 2, duas vezes corresponde a multiplicar por 4 e assim
sucessivamente. O mesmo se aplica à divisão com o shift à direita.
Exemplo
Dividir
110010102 = 20210 por 4.
É
necessário fazer o shift à direita 2 vezes: 0001100102 = 5010
Multiplicar
0000010102 = 1010 por 8.
É
necessário fazer o shift à esquerda 3 vezes: 0010100002 =
8010
Esta
regra também se aplica aos números em complemento para 2 desde que se mantenha
o sinal.