Mapa mental referente a segunda parte do trabalho final, realizado pelo grupo 7: Matheus Henrique de Sousa dos Reis Andrade, Lucas Juscelino de Sousa, Natan Cesário Martins de Loiola, João Lucas da Silva Dutra e José Maria da Silva Júnior.
A Unidade Lógica Aritmética é a parte do computador que realiza as operações lógicas e aritméticas
sobre os dados. Esta parte do computador é considerada, de certa forma, o núcleo do computador,
pois todas as outras áreas do computador como por exemplo a UC, os registradores, memórias e E/S
levam dados para serem processados.
•Uma ALU é baseada nos dispositivos lógicos digitais simples, que podem armazenar dígitos binários
e realizar operações booleanas simples.
Os dados são apresentados à ALU pelos registradores e os resultados de uma operação são
armazenados nos registradores.
Uma ALU também pode definir flags como resultado de uma operação como por exemplo, uma flag de
overflow é definida como 1 se o resultado do cálculo exceder o tamanho do registrador. Os valores da
flag também são armazenados nos registradores dentro do processador.
A unidade de controle dá sinais que controlam a operação da ALU e o movimento de dados para dentro
e para fora da ALU.
Representação de inteiros
A base binária, assim como a decimal, é capaz de simbolizar todos os números possíveis e imagináveis.
No entanto, ao contrário da forma mais comum, utiliza apenas os símbolos 0 e 1. No caso de "vinte e
quatro", por exemplo, se escreve 11000.
No sistema numérico binário, números quaisquer podem ser representados apenas com os dígitos zero
e um, o sinal de menos e a vírgula, ou vírgula fracionada.
Para as finalidades de armazenamento e processamento no computador, porém não temos o benefício
dos sinais de menos e vírgulas. Somente digitos binários (0 e 1) podem ser usados para representar os
números. Se estivermos limitados a inteiros não negativos, a representação é direta.
Existem várias convenções alternativas usadas para representar números inteiros negativos e também
positivos, todas envolvem o tratamento do bit mais signifi cativo (mais à esquerda) na palavra como um
bit de sinal. Se o bit de sinal for 0, o número é positivo; se o bit de sinal for 1, o número é negativo. A
forma de representação mais simples que emprega um bit de sinal é a representação sinal -magnitude.
Em uma palavra de n bits, os n – 1 bits mais à direita representam a magnitude do inteiro.
Aritmética com inteiros
Negação: Na representação sinal -magnitude, a regra para formar a negação de um inteiro é simples:
inverta o bit de sinal. Na notação de complemento de dois, a negação de um inteiro pode ser formada
com as seguintes regras:
1. Apanhe o complemento booleano de cada bit do inteiro (incluindo o bit de sinal). Ou seja, defi na
cada 1 como 0, e cada 0 como 1.
2. Tratando o resultado como um inteiro binário sem sinal, some 1.
Esse processo em duas etapas é conhecido como a operação de complemento de dois, ou achar o
complemento de dois de um inteiro.
Adição e subtração : A adição prossegue como se os dois números fossem inteiros sem sinal. Os
quatro primeiros exemplos ilustram operações bem sucedidas. Se o resultado da operação for
positivo, obtemos um número positivo na forma de complemento de dois, que é a mesma que na
forma de inteiro sem sinal. Se o resultado da operação for negativo, obtemos um número negativo na
forma de complemento a dois. Observe que, em alguns casos, existe um bit de carry além do final da
palavra (indicado pelo sombreado), que é ignorado.
Em qualquer adição, o resultado pode ser maior do que pode ser mantido no tamanho da palavra
sendo usado. Essa condição é chamada de overflow (estouro). Quando ocorre overflow, a ALU precisa
sinalizar esse fato de modo que não haja qualquer tentativa de usar o resultado. Para detectar o
overflow, a seguinte regra é observada:
Regra do overflow: se dois números são somados e ambos são positivos ou ambos negativos, então o
overflow ocorre se, e somente se, o resultado tiver o sinal oposto.
Regra da subtração: para subtrair um número (subtraendo) de outro (minuendo), apanhe o
complemento de dois (negação) do subtraendo e some-o ao minuendo.
Multiplicação Em comparação com a adição e a subtração, a multiplicação é uma operação complexa,
seja ela realizada no hardware ou pelo software. Diversos algoritmos foram usados em diversos
computadores. A finalidade desta subseção é dar ao leitor alguma ideia do tipo de técnica
normalmente utilizado. Começamos com o problema mais simples de multiplicar dois inteiros sem
sinal (não negativos) e depois examinamos uma das técnicas mais comuns para a multiplicação de
números na representação de complemento a dois
INTEIROS SEM SINAL: A multiplicação envolve a geração de produtos parciais, um para cada dígito no
multiplicador. Esses produtos parciais são então somados para produzir o produto final. 2. Os
produtos parciais são facilmente definidos. Quando o bit multiplicador é 0, o produto parcial é 0.
Quando o multiplicador é 1, o produto parcial é o multiplicando. 3. O produto total é produzido
somando -se os produtos parciais. Para essa operação, cada produto parcial sucessivo é deslocado
uma posição à esquerda em relação ao produto parcial anterior. 4. A multiplicação de dois inteiros
binários de n bits resulta em um produto de até 2n bits de extensão (por exemplo, 11 × 11 = 1001).
Divisão: A divisão é um pouco mais complexa que a multiplicação, mas é baseada nos mesmos
princípios gerais. Como antes, a base para o algoritmo é a técnica de lápis e papel, e a operação
envolve deslocamento repetitivo e adição ou subtração.
Primeiro, os bits do dividendo são examinados da esquerda para a direita, até que o conjunto de bits
examinados represente um número maior ou igual ao divisor; isso é conhecido como o divisor sendo
capaz de dividir o número. Até que esse evento ocorra, 0s são colocados no quociente da esquerda
para a direita. Quando o evento ocorre, um 1 é colocado no quociente e o divisor é subtraído do
dividendo parcial.
O resultado é conhecido como resto parcial. Desse ponto em diante, a divisão segue um padrão cíclico.
Em cada ciclo, bits adicionais do dividendo são anexados ao resto parcial até que o resultado seja
maior ou igual ao divisor. Como antes, o divisor é subtraído desse número para produzir um novo resto
parcial. O processo continua até que os bits do dividendo terminem.
O divisor é colocado no registrador M, o dividendo no registrador Q. Em cada etapa, os registradores A
e Q juntos são deslocados à esquerda por 1 bit. M é subtraído de A para determinar se A divide o resto
parcial.3 Nesse caso, então Q0 recebe um bit 1. Caso contrário, Q0 recebe um bit 0 e M precisa ser
somado de volta a A para restaurar o valor anterior. O contador é então decrementado e o processo
continua por n etapas. Ao final, o quociente está no registrador Q e o resto está no registrador A.
Esse processo pode, com alguma dificuldade, ser estendido a números negativos.
Representação de ponto flutuante
Uma operação de ponto flutuante pode produzir uma destas condições: Overflow de expoente: um
expoente positivo excede o valor máximo possível para expoente. Em alguns sistemas, isso pode ser
designado como +∞ ou –∞.
Underflow de expoente: um expoente negativo é menor que o valor mínimo possível para expoente (por
exemplo, –200 é menor que –127). Isso significa que o número é muito pequeno para ser representado, e
pode ser informado como 0.
Underflow de significando: no processo de alinhamento dos significandos, os dígitos podem sair pela
extremidade direita do significando. Conforme veremos, alguma forma de arredondamento é necessária.
Overflow de significando: a adição de dois significandos com o mesmo sinal pode resultar em um carry
pelo bit mais significativo. Isso pode ser resolvido pelo realinhamento, conforme explicaremos.
Adição e subtração;
Na aritmética de ponto flutuante, adição e subtração são mais complexas do que multiplicação e divisão.
Isso deve -se à necessidade de alinhamento. Existem quatro fases básicas do algoritmo para adição e
subtração: 1. Verificar zeros. 2. Alinhar os significandos. 3. Somar ou subtrair os significandos. 4.
Normalizar o resultado.
Fase 1: verificação de zero. Como a adição e a subtração são idênticas, exceto por uma mudança de
sinal, o processo começa alterando o sinal do subtraendo, se essa for uma operação de subtração. Em
seguida, se algum operando for 0, o outro é informado como o resultado.
Fase 2: alinhamento do significando. A próxima fase é manipular os números de modo que os dois
expoentes sejam iguais
Fase 3: adição. Em seguida, os dois significandos são somados, levando em conta seus sinais. Como os
sinais podem ser diferentes, o resultado pode ser 0. Há também a possibilidade de overflow do
significando por 1 dígito. Se isso acontecer, o significando do resultado é deslocado para a direita e o
expoente é incrementado. Um overflow de expoente poderia ocorrer como resultado; isso seria
informado e a operação encerrada.
Fase 4: normalização. A fase final normaliza o resultado. A normalização consiste no deslocamento
dos dígitos do significando para a esquerda até que o dígito mais significativo (bit, ou 4 bits para
expoente na base 16) seja diferente de zero. Cada deslocamento causa um decremento do expoente
e, portanto, poderia causar um underflow do expoente. Finalmente, o resultado precisa ser
arredondado e depois informado. Adiamos uma discussão do arredondamento para a discussão da
multiplicação e divisão.
Padrão do IEEE para a aritmética binária de ponto flutuante; O IEEE 754 vai além da simples definição
de um formato para estabelecer práticas e procedimentos específicos de modo que a aritmética de
ponto flutuante produza resultados uniformes e previsíveis, independentes da plataforma de
hardware. Um aspecto disso já foi discutido, a saber, o arredondamento. Esta subseção examinará
três outros tópicos: infinito, NaNs e números desnormalizados
Aritmética de ponto flutuante .
Vírgula flutuante ou ponto flutuante (do inglês floating point): é um formato de representação digital de
números racionais, que é usada nos computadores.
Com uma notação de ponto fixo (por exemplo, complemento de dois), é possível representar um
intervalo de inteiros positivos e negativos centrados em 0. Assumindo um binário fixo e ponto
fracionário, esse formato permite a representação de números também com um componente
fracionário.
Essa técnica tem limitações. Números muito grandes não podem ser representados, nem frações
muito pequenas. Além do mais, a parte fracionária do quociente em uma divisão de dois números
grandes poderia ser perdida.
Para números decimais, contornamos essa limitação usando a notação científi ca. Assim,
976.000.000.000.000 pode ser representado como 9,76 × 1014, e 0,0000000000000976 pode ser
representado como 9,76 × 10–14. O que fi zemos, com efeito, foi deslocar dinamicamente a vírgula
decimal para um local conveniente e usar o expoente de 10 para registrar esse ponto decimal. Isso
permite que um intervalo de números muito grandes e muito pequenos seja representado com apenas
alguns dígitos.
Para simplificar as operações sobre números de ponto flutuante, normalmente é exigido que eles
sejam normalizados. Um número normalizado é aquele em que o dígito mais significativo do
significando é diferente de zero. Para a representação na base 2, um número normalizado é, portanto,
um número em que o bit mais significativo do significando é 1.
Números negativos menores que – (2 – 2–23) × 2128, chamados de overflow negativo. Números
negativos maiores que 2–127, chamados de underflow negativo. Zero. Números positivos menores que
2–127, chamados de underflow positivo. Números positivos maiores que (2 – 2–23) × 2128, chamados
de overflow positivo.
A representação de ponto flutuante mais importante é definida no IEEE Standard 754, adotado em
1985. Esse padrão foi desenvolvido para facilitar a portabilidade dos programas de um processador
para outro e encorajar o desenvolvimento de programas sofisticados, orientados numericamente. O
padrão tem sido bastante adotado e é usado em praticamente todos os processadores e
coprocessadores aritméticos atuais.
Para valores de expoente na faixa de 1 a 254 para o formato simples e de 1 a 2046 para o formato
duplo, números de ponto flutuantes normalizados diferentes de zero são representados. O expoente
é viesado, de modo que o intervalo de expoentes é de –126 a +127 no formato simples e de –1.022 a
+1.023. Um número normalizado requer um bit 1 à esquerda da vírgula binária; esse bit é
pressuposto, dando um significando efetivo de 24 bits ou 53 bits (chamado de fração no padrão). Um
expoente zero junto com uma fração igual a zero representa zero positivo ou negativo, dependendo
do bit de sinal. Conforme mencionamos, é útil ter um valor exato de 0 representado. Um expoente
com todos os bits 1 junto com uma fração igual a zero representa infinito positivo ou negativo,
dependendo do bit de sinal.
Também é útil ter uma representação de infi nito. Isso deixa para o usuário a função de decidir se
tratará o overfl ow como uma condição de erro ou carregar o valor q e prosseguir com o programa que
estiver sendo executado. Um expoente de zero junto com uma fração diferente de zero representa um
número desnormalizado. Nesse caso, o bit à esquerda do ponto binário é zero e o expoente verdadeiro
é –126 ou –1.022. O número é positivo ou negativo, dependendo do bit de sinal. Um expoente com
todos os bits 1 junto com uma fração diferente de zero recebe o valor NaN, que signifi ca Not a
Number (não um número), e é usado para sinalizar diversas condições de exceção.