Se você tivesse que implementar a soma de dois números inteiros representados usando 8 bits em excesso de
com
, quais seriam os passos para realizar essa operaçīo?
Passo 1
Primeiro vamos entender direitinho o que significa “8 bits em excesso de
com
”.
- Um valor armazenado de 8 bits, que vou chamar de
, é um número inteiro sem sinal entre e . - O inteiro real que esse
representa é com . Ou seja, o intervalo representável é
porque
varia de
a
e
varia de
a
.
O que o exercício pede: dado dois valores armazenados de 8 bits em excesso-127 (vou chamar e
), apresentar os passos para implementar a soma dos inteiros que eles representam e produzir o resultado também em excesso-127 (se couber).
O que o exercício pede: dado dois valores armazenados de 8 bits em excesso-127 (vou chamar
Passo 2
Vou escrever as relações matemáticas que ligam as quantidades:
- Se
e são os bytes armazenados, os inteiros reais são
- A soma real é
- Para devolver o resultado no mesmo formato em excesso-127, precisamos produzir o byte
Essa fórmula é a grande sacada: em vez de decodificar, somar e recodificar, dá para somar diretamente os bytes
e depois subtrair o viés
.
Passo 3
Implementação prática passo a passo (visão geral, adequada tanto para software quanto hardware):
- Trate
e como inteiros sem sinal de 8 bits ( – ). Use um registrador temporário de pelo menos 9 bits para evitar perder carry. - Calcule o somatório temporário de maior precisão:
onde
pode variar de
a
(ou seja, cabe em 9 bits).
3. Subtraia o viés :
3. Subtraia o viés
Implemente a subtração com um somador (fazendo
) ou com um subtrator direto; mantenha o resultado em pelo menos 9 bits (pois
pode variar de
a
).
4. Detecte overflow/underflow de representação: o valor final armazenável em 8 bits deve satisfazer . Se
ou
então a soma dos inteiros reais não cabe no formato de 8 bits em excesso-127 (ou seja, ocorreu overflow aritmético) e deve-se sinalizar erro/overflow ou aplicar política desejada (truncar, saturar, provocar exceção, etc.).
5. Se não houve overflow, o byte de saída é simplesmente os 8 bits menos significativos de (ou, equivalentemente,
representado em 8 bits): esse é o resultado em excesso-127. O inteiro real resultante é
.
4. Detecte overflow/underflow de representação: o valor final armazenável em 8 bits deve satisfazer
5. Se não houve overflow, o byte de saída é simplesmente os 8 bits menos significativos de
Passo 4
Como detectar overflow de forma simples em implementações concretas:
- Em software: calcule
com tipo inteiro maior (por exemplo 16 bits), calcule . Verifique se . Se sim, retorne . Se não, trate overflow. - Em hardware com somadores: faça um somador de 8 bits com carry-out para obter
de 9 bits; depois subtraia (operando em 9 bits). Assim o bit mais significativo do resultado de 9 bits indica se (se esse bit for então ). Para detectar , verifique se houve borrow na subtração (ou compare ). Em resumo: - Condição
se . - Condição
se equival. (mas mais simples é testar bit 8 do resultado em 9 bits).
- Condição
Passo 5
Exemplos concretos — para fixar:
- Exemplo sem overflow: some
e . Em excesso-127:
- Exemplo com overflow: some
e . Esses e estão nos limites (note que é o máximo representável):
Aqui
não cabe em 8 bits (
) — overflow ocorreu (o resultado real seria
, que não é representável no intervalo
).
Passo 6
Observações finais e alternativas:
- Alternativa trivial e segura: decodificar para inteiros com sinal (por exemplo,
e ), somar , verificar se está em e então codificar . Essa via é mais direta em software e evita pensar em truques com bias, mas é um passo a mais de subtração/adição. - Em hardware de alto desempenho costuma-se usar a fórmula direta
para economizar etapas. Só cuidado com largura dos registradores e sinais de overflow.
Resposta
- Receber
(bytes em excesso-127). - Calcular
em pelo menos 9 bits. - Calcular
(manter 9 bits). - Se
ou => overflow (resultado não representável). - Se não houve overflow => saída é o byte de 8 bits
(que representa o inteiro ).