sexta-feira, 5 de outubro de 2012

Operações com Binário


Operações com Binário

No artigo anterior falei das bases de numeração. Neste artigo falarei sobre operações aritméticas em binário.
É relativamente simples: 1 + 1 = 10!
Bom… acho que uma explicação mais detalhada é melhor :P
As operações de soma a subtração em binário são muito parecidas com as operações de soma e subtração convencionais: Soma-se (ou subtrai-se) os 2 números, começando pela direita, se “sobra” um numero, coloca ele no próximo algorismo (ou, na subtração, se pede “emprestado”):
Fazendo somas decimais passo a passo:
49 + 28.
Soma-se o 9 com o 8. O resultado é 17. Como 17 é maior que 10, “guardamos” o que sobra para  soma dos próximos algorismos.
Em seguida, soma-se o 4 e o 2. O resultado é 6. Como na soma dos algorismos anterior havia “sobrado” um numero, adiciona-se este numero ao 6, ou seja, 6+1=7. O resultado é 77.
A subtração é mesma coisa:
23 – 15.
Calcula-se 3 – 5. Como 3 é menor que 5, ele “pede emprestado” um numero para o 2. Então calcula-se 13-5, que é 8.
Na subtração do segundo algorismo, o 2, que “emprestou” para o 3, passou a ser 1. Então, 1 – 1 = 0. O resultado da conta é 8.
Não fiz desenho pois todo mundo já deve ter aprendido isto na escola!
Em binário, há somente 2 dígitos: 0 e 1. Porém a soma funciona da mesma forma que na álgebra normal. Devemos lembrar sempre que:
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 10.
Repare no ultimo calculo: 1+1 = 10. O “1″ do 10 é justamente o que sobra do calculo de 1+1. Este “1″ que sobrou é chamado de “Carry”.
Um ponto a ser observado é que em binário é comum ocorrer um verdadeiro “Efeito dominó” de sobras durante a soma. O que quero dizer com efeito “dominó”: Em decimal, a soma  9999 +1, como 9+1 = 10, na soma do primeiro algorismo vai sobrar um valor, que deve ser acrescentado ao segundo algorismo. Porém, esta soma também causará uma sobra, que será adicionada ao terceiro… que também causará a sobra que deverá ser adicionada ao quarto algorismo, que também sobrará e, finalmente, um quinto algorismo deverá ser adicionado, gerando a resposta 10000. Como em binário só temos 2 dígitos, este “efeito dominó” ocorre muito frequentemente. Só coloquei este alerta pois já vi casos de pessoas que, realizando exercícios, ao somar em binário acharam que o calculo estava errado por causa do efeito dominó.
continuando:
O procedimento da soma é igual na soma decimal, porém, com só 2 valores possíveis: 0 e 1.
exemplo:
10101001 + 00110011 = 11011100
somabinaria
Ta ali a soma. Os numeros em vermelhos são as “sobras” da soma dos algarismos anteriores. Exatamente como a soma convencional, porém usando só 0 e 1!
Se no ultimo algorismo também “sobrasse” 1, era só colocar mais um algorismo no final, exemplo:
11111111 + 00000001 = 100000000
Nós, humanos, podemos ir adicionando numerosinhos enquanto houver espaço no papel. Computadores não tem este luxo: Se o computador que realizar a soma que fiz de de 11111111 + 1 não conseguir trabalhar com mais de 8 bits, o resultado seria 00000000 e um erro de overflow!. (Overflow é quando o resultado de um calculo é muito grande para a máquina). Se a soma fosse 11111111 + 00000010, o resultado seria 00000001 com erro de overflow.  Efetivamente, 255 + 2 = 1 com aviso de erro de overflow.
É importante lembrar que, se estamos trabalhando com números de 8 bits, serão sempre 8 bits a resposta. Se estivermos trabalahndo com numeros de 16bits, a resposta será sempre 16bits! Se o resultado ultrapassar o numero de bits, então ocorre um overflow.
O maior numero possivel de representar dado um determinado numero de bits binários é dada pela seguinte equação:
(2^N)-1. Aonde N é o numero de bits. Para 8 bits, o valor é( 2^8)-1 ou seja: 256-1, ou 255. Valores entre 0 e 255 são válidos.
Não vou falar de subtração agora, pois preciso falar de números negativos e um fato sobre computadores.
Nós, humanos, sabemos diferenciar um numero positivo de um numero negativo porque, no numero negativo, existe um sinal de “menos”(-) antes do numero. Lembra quando eu disse que computadores só conhecem 0 e 1? então… eles não conhecem numeros com sinais de menos…
Se vocês se lembram da escola, 5 + (-3) é o mesmo que 5 – 3, e, obviamente, 5 -3 é o mesmo que 5 + (-3). Ou seja: A subtração de um A por um numero B é o mesmo que somar A com o B negativo. Esta propriedade matemática também se aplica em binário, e por isto, computadores não sabem subtrair! Eles só somam. Para subtrair, A de B, eles transformam B em um numero negativo,e em seguida, somam. Mas, como computadores sabem quando um numero é negativo?
Quando a infomática surgiu, um número negativo era o mesmo numero positivo porém invertido: O numero dez, em binário, é 00001010. O dez negativo é 11110101. O sistema diferencia um numero positivo de um negativo pelo “1″ no bit mais significaivo (o mais à esquerda). Este método, chamado de “Complemento de um”, funciona bem, o problema é que existe uma ambiguidade: E o numero zero? 00000000 e 11111111 represemtam 0.
E isto é um GRANDE problema, pois não existe “Zero negativo”.
Para solucionar isto, foi criado o “Complemento de dois”, que funciona assim:
Sempre que ocorre uma conversão de positivo para negativo ou vice versa, além da inversão de digitos, ocorre a soma de 1 ao valor resultante.No caso, o numero zero ficara 11111111 + 1 = 00000000.
Então, se dez positivo é 00001010, dez negativo é 11110101 + 1 = 11110110.
Para transformar dez negativo em dez positivo, basta repetir o processo: 11110110 -> 00001001 + 1 = 00001010.
Vamos testar: dez positivos somados com dez negativos, deve ser zero (10 + (-10)) = 10-10 = 0.
00001010 + 11110110 = 100000000. O 1 que sobrou é descartado pelo sistema. Isso funciona sempre. O sistema faz testes para detectar Overflows durante a soma. O teste é simples: Se os 2 ultimos bits de “vai um” (Carry) forem 1 e 1 ou 0 e 0, a troca de sinal ocorreu de forma válida. Se for 0 e 1 ou 1 e 0, então ocorreu um overflow.
Quando se lida com complemento de 2, o intervalo numérico representado dado um numero de bits é o seguinte:
De -2^(N-1) até (2^(N-1))-1. Ou seja: Para 8 bits, o intervalo vai de -2^(8-1) até (2^(8-1))-1, que é o mesmo que -2^7 até (2^7)-1, que é o mesmo que -128 até 127.
Na wikipedia, em ingles, tem uma explicação completa e detalhada sobre o complemento de 2.
Como foi possivel perceber, com 1 byte é possivel representar números entre 0 e 255, ou entre -128 e 127.
Como o sistema sabe quando um byte deve ser considerado como sendo entre 0 e 255 ou -128 e 127? Simples: Ele não sabe. O programa em execução é o responsável por definir se o byte é Unsigned (entre 0 e 255) ou Signed (entre -128 e 127).
Espero que este texto não tenha ficado muito confuso – foi o melhor que eu pude fazer para este tópico. O próximo artigo será mais legal: Falará sobre operações booleanas : And, Or, Xor, Not

a� k 1 1 ��S �8 00000000.
Então, se dez positivo é 00001010, dez negativo é 11110101 + 1 = 11110110.
Para transformar dez negativo em dez positivo, basta repetir o processo: 11110110 -> 00001001 + 1 = 00001010.
Vamos testar: dez positivos somados com dez negativos, deve ser zero (10 + (-10)) = 10-10 = 0.
00001010 + 11110110 = 100000000. O 1 que sobrou é descartado pelo sistema. Isso funciona sempre. O sistema faz testes para detectar Overflows durante a soma. O teste é simples: Se os 2 ultimos bits de “vai um” (Carry) forem 1 e 1 ou 0 e 0, a troca de sinal ocorreu de forma válida. Se for 0 e 1 ou 1 e 0, então ocorreu um overflow.
Quando se lida com complemento de 2, o intervalo numérico representado dado um numero de bits é o seguinte:
De -2^(N-1) até (2^(N-1))-1. Ou seja: Para 8 bits, o intervalo vai de -2^(8-1) até (2^(8-1))-1, que é o mesmo que -2^7 até (2^7)-1, que é o mesmo que -128 até 127.
Na wikipedia, em ingles, tem uma explicação completa e detalhada sobre o complemento de 2.
Como foi possivel perceber, com 1 byte é possivel representar números entre 0 e 255, ou entre -128 e 127.
Como o sistema sabe quando um byte deve ser considerado como sendo entre 0 e 255 ou -128 e 127? Simples: Ele não sabe. O programa em execução é o responsável por definir se o byte é Unsigned (entre 0 e 255) ou Signed (entre -128 e 127).
Espero que este texto não tenha ficado muito confuso – foi o melhor que eu pude fazer para este tópico. O próximo artigo será mais legal: Falará sobre operações booleanas : And, Or, Xor, Not


História e Evolução dos Computadores


História e Evolução dos Computadores

Nos dias de hoje, quando se ouve falar num processadores de 1 GHz até nos dá sono, de tão comuns que eles já se tornaram. Pouca gente já ouviu falar no 8088, que foi o processador usado no PC XT, a quase 20 anos atrás, e muito menos no Intel 4004, o primeiro microprocessador, lançado em 71.
Na época dos nossos bisavós os computadores já existiam, apesar de extremamente rudimentares. Eram os computadores mecânicos, que realizavam cálculos através de um sistema de engrenagens, acionado por uma manivela ou outro sistema mecânico qualquer. Este tipo de sistema, comum na forma de caixas registradoras era bastante utilizado naquela época.
No final do século XIX surgiu o relê, um dispositivo eletromecânico, formado por um magneto móvel, que se desloca unindo dois contatos metálicos. O Relê foi muito usado no sistema telefônico, aliás algumas centrais analógicas ainda utilizam estes dispositivos até hoje. Os relês podem ser considerados uma espécie de antepassados dos transístores. Suas limitações eram o fato de serem relativamente caros, grandes demais e ao mesmo tempo muito lentos: um relê demora mais de um milésimo de segundo para fechar um circuito, mais de dez milhões de vezes mais lento que um transístor atual.
Também no final do século XIX, surgiram as primeiras válvulas. As válvulas foram usadas para criar os primeiros computadores eletrônicos, na década de 40.
As válvulas tem seu funcionamento baseado no fluxo de elétrons no vácuo. Tudo começou numa certa tarde quando Thomas Edison, inventor da lâmpada elétrica estava brincando com a sua invenção. Ele percebeu que ao ligar a lâmpada ao polo positivo de uma bateria e uma placa metálica ao polo negativo, era possível medir uma certa corrente fluindo do filamento da lâmpada à chapa metálica, mesmo que os dois estivessem isolados. Havia sido descoberto o efeito termoiônico, o princípio de funcionamento das válvulas.
As válvulas já eram bem mais rápidas que os relês, atingiam frequências de alguns Megahertz, o problema é que aqueciam muito, consumiam muita eletricidade e queimavam-se facilmente. Construir um computador, que usava milhares delas era extremamente complicado, e muito caro.
Apesar de tudo isso, os primeiros computadores começaram a surgir durante a década de 40, naturalmente com propósitos militares. Os principais usos eram a codificação e decodificação de mensagens e cálculos de artilharia.
Sem dúvida, o computador mais famoso daquela época foi o ENIAC (Electronic Numerical Integrator Analyzer and Computer), construído em 1945. O ENIAC era composto por nada menos do que 17,468 válvulas, ocupando um galpão imenso. Porém, apesar do tamanho, o poder de processamento do ENIAC é ridículo para os padrões atuais, suficiente para processar apenas 5.000 adições, 357 multiplicações e 38 divisões por segundo, bem menos até do que uma calculadora de bolso atual, das mais simples.
A idéia era construir um computador para realizar vários tipos de cálculos de artilharia para ajudar as tropas aliadas durante a segunda Guerra mundial. Porém, o ENIAC acabou sendo terminado exatos 3 meses depois do final da Guerra e acabou sendo usado durante a guerra fria, contribuindo por exemplo no projeto da bomba de Hidrogênio.

Parte do galpão que abrigava o ENIAC

Se você acha que programar em C ou em Assembly é complicado, imagine como era a vida dos programadores daquela época. A programação do ENIAC era feita através de 6.000 chaves manuais. A cada novo cálculo, era preciso reprogramar várias destas chaves. Isso sem falar no resultado, que era dado de forma binária através de um conjunto de luzes. Não é à toa que a maior parte dos programadores da época eram mulheres, só mesmo elas para ter a paciência necessária para programar e reprogramar esse emaranhado de chaves várias vezes ao dia.
Abaixo está a foto de uma válvula muito usada na década de 40:

Vendo essa foto é fácil imaginar por que as válvulas eram tão problemáticas e caras: elas eram simplesmente complexas demais.
Mesmo assim, na época a maior parte da indústria continuou trabalhando no aperfeiçoamento das válvulas, obtendo modelos menores e mais confiáveis. Porém, vários pesquisadores, começaram a procurar alternativas menos problemáticas.
Várias destas pesquisas tinha como objetivo a pesquisa de novos materiais, tanto condutores, quanto isolantes. Os pesquisadores começaram então a descobrir que alguns materiais não se enquadravam nem em um grupo nem no outro, pois de acordo com a circunstância, podiam atuar tanto quando isolantes quanto como condutores, formando uma espécie de grupo intermediário que foi logo apelidado de grupo dos semicondutores.
Haviam encontrado a chave para desenvolver o transístor. O primeiro projeto surgiu em 16 de Dezembro de 47, onde era usado um pequeno bloco de germânio (que na época era junto com o silício o semicondutor mais pesquisado) e três filamentos de ouro. Um filamento era o polo positivo, o outro o polo negativo, enquanto o terceiro tinha a função de controle. Tendo apenas uma carga elétrica no polo positivo, nada acontecia, o germânio atuava como um isolante, bloqueando a corrente. Porém, quando uma certa tensão elétrica era aplicada usando o filamento de controle, uma fenômeno acontecia e a carga elétrica passava a fluir para o polo negativo. Haviam criado um dispositivo que substituía a válvula, sem possuir partes móveis, gastando uma fração da eletricidade gasta por uma e, ao mesmo tempo, muito mais rápido.

O primeiro projeto de transístor.

Este primeiro transístor era relativamente grande, mas não demorou muito para que este modelo inicial fosse aperfeiçoado. Durante a década de 50, o transístor foi gradualmente dominando a indústria, substituindo rapidamente as problemáticas válvulas. Os modelos foram diminuindo de tamanho, caindo de preço e tornando-se mais rápidos. Alguns transístores da época podiam operar a até 100 MHz. Claro que esta era a freqüência que podia ser alcançada por um transístor sozinho, nos computadores da época, a freqüência de operação era muito menor, já que em cada ciclo de processamento o sinal precisa passar por vários transístores.
Mas, o grande salto foi a substituição do germânio pelo silício. Isto permitiu miniaturizar ainda mais os transístores e baixar seu custo de produção. Os primeiros transístores de junção comerciais foram produzidos partir de 1960 pela Crystalonics.
A idéia do uso do silício para construir transístores é que adicionando certas substâncias em pequenas quantidades é possível alterar as propriedades elétricas do silício. As primeiras experiências usavam fósforo e boro, que transformavam o silício em condutor por cargas negativas ou condutor por cargas positivas, dependendo de qual dos dois materiais fosse usado. Estas substâncias adicionadas ao silício são chamadas de impurezas, e o silício “contaminado” por elas é chamado de silício dopado.
O funcionamento e um transístor é bastante simples, quase elementar. É como naquele velho ditado “as melhores invenções são as mais simples”. As válvulas eram muito mais complexas que os transístores e mesmo assim foram rapidamente substituídas por eles.
Um transístor é composto basicamente de três filamentos, chamados de base, emissor e coletor. O emissor é o polo positivo, o coletor o polo negativo, enquanto a base é quem controla o estado do transístor, que como vimos, pode estar ligado ou desligado. Veja como estes três componentes são agrupados num transístor moderno:

Quando o transístor está desligado, não existe carga elétrica na base, por isso, não existe corrente elétrica entre o emissor e o coletor. Quanto é aplicada uma certa tensão na base, o circuito é fechado e é estabelecida a corrente entre o emissor e o receptor.
Outro grande salto veio quando os fabricantes deram-se conta que era possível construir vários transístores sobre o mesmo waffer de silício. Havia surgido então o circuito integrado, vários transístores dentro do mesmo encapsulamento. Não demorou muito para surgirem os primeiros microchips.