O Co do último FA pode ser útil para acusar se o resultado da soma deu overflow.
Por exemplo, se somarmos 9 + 7, o resultado será 16_{10} = 10000_2, só que 16 precisa de 5 bits, e só somos capazes de armazenar os 4 primeiros, logo o resultado ficaria assim:
Circuito subtrator
Existem circuitos subtratores propriamente ditos - cuja a única função é subtrair dois números -, mas não é tão comum vermos circuitos assim.
Geralmente usamos circuitos somadores para executar subtrações. E aí você me pergunta, "como é possível subtrair somando?"
Pois bem, a técnica que vamos usar será a seguinte:
- Pegar o complemento-2 do subtraendo, que consiste em inverter os bits (aonde for 1 vira 0 e vice-versa) e depois incrementar em 1 unidade este número.
- Somar o minuendo com o complemento-2 do subtraendo.
Este complemento-2 basicamente inverte o sinal de um número para o computador, então se um número é positivo, o complemento-2 o tornará negativo. Não é todos os computadores que usam esse padrão para salvar números negativos, porém a maioria esmagadora usa, justamente por essa facilidade de poder usar um circuito somador tanto para adição quanto para subtração.
Com algumas alterações no circuito anteriormente montados, podemos criar um circuito somador/subtrator da seguinte forma:
Note que trocamos o half-adder inicial por um full-adder e incluímos uma entrada M, que serve para indicar se queremos somar ou subtrair.
Ligamos M tanto em portas XOR quanto na entrada "Ci" do FA inicial para gerar o complemento-2 de B:
- Lembre-se daquela propriedade anteriormente explicada do XOR: se a entrada Q valer 0, a saída de XOR será o valor de P, e se Q for 1, a saída de XOR será !P. Então se M for 0, B continua normal, mas se M for 1, nós invertemos os bits de B.
- Ao ligar M em Ci, estamos incrementando 1 à soma, que é justamente o último passo para gerar o complemento-2 após inverter B.
Vamos subtrair 7 de 9 usando o circuito que montamos:
De fato, 9 - 7 = 2 = 10_2
E não se preocupe com o Co indicando 1. Ele acusa overflow somente em somas. Em subtrações, teríamos que desenvolver outro sistema para acusar overflow, o que não vamos fazer hoje.
Chegamos ao fim da nossa jornada, agradeço a todos aqueles que leram até aqui. Eu espero que tenha sido uma leitura proveitosa e que eu tenha despertado em vocês o fascínio e a vontade de pesquisar mais sobre. Vou anexar abaixo conteúdos sobre os temas discutidos aqui.
Sobre números binários:
- Deixo como sugestão de material o curso de bases numéricas do Curso em Vídeo
- Deixo também este vídeo como material complementar ensinando como contar nos dedos em binário (é um conhecimento legal, vai!?)
Sobre portas lógicas:
- Deixo como sugestão de leitura estes slides sobre funções lógicas e portas lógicas
- Como material complementar de portas lógicas, deixo este vídeo da ENSICO.
Deixo também como sugestão o curso de circuitos digitais do lendário professor Pedro Souza, simplesmente um dos melhores professores que já vi.
Caso queira um livro para ir mais a fundo em circuitos, há muitos materiais, mas recomendo de início darem uma lida no livro do Tocci, do Widmer e do Moss - Sistemas Digitais: Princípios e Aplicações
Também recomendo como material complementar o livro do Peter Pacheco: Uma Introdução à Programação Paralela. Apesar de ser um livro sobre paralelização, nos primeiros capítulos ele explica de forma muito boa arquitetura de computadores, cacheamento, como o processador coordenada threads, tipos de processadores, paralelismo a nível de hardware, etc.