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: 
 bits é -2
      n-1 ... 2 n-1-1.
bits é -2
      n-1 ... 2 n-1-1. 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.