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
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.
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
10101001 + 00110011 = 11011100
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.
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
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