A. Sistemas de Numeração. Para se entender a linguagem do computador (o Código de Máquina), é necessário conhecer um pouco da teoria dos números. Não é uma tarefa tão difícil quanto pode parecer. Sabendo-se contar até 16, não terá qualquer dificuldade. Mas, inicialmente é preciso aprender a contar até 2. A.1. Decimal (Base 10) Mesmo a pessoa mais avessa à matemática não tem qualquer dificuldade para dizer as horas ou acompanhar o resultado de uma partida de futebol. O uso dos números faz parte do dia-a-dia de tal forma que nunca nos preocupamos com a maneira com que eles funcionam. No mundo ocidental usamos habitualmente um sistema numérico baseado no número 10. Isto significa que começamos uma contagem usando os números de 0 a 9. Se precisarmos de uma grandeza maior do que 9, usamos os dígitos disponíveis. Assim, colocamos o 1 na “casa” da esquerda e o 0 à sua direita (10). Este é chamado de um sistema de numeração de base 10 ou decimal, porque o valor do dígito é multiplicado por 10 a cada posição que se conta. Por exemplo, o número 275 corresponde ao valor calculado por 2 x 102 + 7 x 101 + 5 x 100, ou seja 200 + 70 + 5. Todo sistema que usa esse método para representar números é chamado de posicional. 275 centena 102 2 ↓ 2 x 102 ↓ 200 + + dezena 101 7 ↓ 7 x 101 ↓ 70 unidade 100 5 ↓ + 5 x 100 ↓ + 5 275 Tudo isso parece óbvio porque fazemos esses cálculos todos os dias, sem pensarmos muito neles. Entretanto, existem outros sistemas de numeração, diferentes do decimal, como por exemplo, os que são usados nos modernos micros. A.2. Binário (Base 2) Para os computadores digitais, o sistema de numeração mais apropriado é o baseado no número 2. Isso acontece porque o computador é composto de circuitos eletrônicos que possuem dois estados evidentes: ligado (há corrente de energia) e desligado (não há corrente). O estado “desligado” representa o número 0, e o “ligado”, o número 1. E, na base 2, estes são todos os dígitos de que se necessita para expressar qualquer valor. O sistema binário é composto apenas por zeros e uns; todos os outros dígitos foram abolidos. Dessa forma, se se começar a contar da maneira habitual, não vai passar de 1. Some 12 a 12 e terá o número 1 deslocado uma casa para a esquerda, enquanto a casa da direita é zerada. Assim, em binário, 12 + 12 = 102. Contar de 0 a 15, em decimal, resulta em (não adianta tentar decorar...): DECIMAL 0 1 2 3 4 5 6 7 BINÁRIO 0000 0001 0010 0011 0100 0101 0110 0111 DECIMAL 8 9 10 11 12 13 14 15 BINÁRIO 1000 1001 1010 1011 1100 1101 1110 1111 A adição de valores binários obedece a seguinte regra: 0 + 0 = 0 ; 0 + 1 = 1 ; 1 + 1 = 0, "vai 1" . Para somar 102 + 112, deve-se primeiramente somar os dois números da direita, 0 + 1. A seguir, devem ser somados os dois da esquerda, 1+1 o que dá 2; só que em binário é 102. Assim 102+112=1012; ou seja, em decimal, 2+3=5. A A subtração em binário é um processo tão direto quanto a soma. O único detalhe a observar é o número que se “leva” para a próxima casa. A multiplicação e a divisão são tão fáceis que “até” um computador pode fazer essas operações. No primeiro caso, tudo se resume a multiplicar 0 x 0 = 0 ; 0 x 1= 0 ; 1 x 1 = 1 . A divisão é igualmente simples: em cada operação, basta decidir se o divisor está dentro do dividendo uma vez ou nenhuma vez, ou 0 ÷ 0 = 0 ; 0 ÷ 1 = 0 ; 1 ÷ 0 = 0 ; 1 ÷ 1 = 1 . A.3. Hexadecimal (Base 16) Embora o sistema de numeração binário seja muito simples, pelo fato de haver muitos zeros e uns na composição de números com oito, dezesseis ou mais dígitos binários, pode-se criar certa dificuldade na compreensão e manipulação. Os esforços para contornar tais problemas fez com que surgisse um sistema numérico com outra base, mas que ainda seja semelhante, em concepção, ao sistema binário utilizado pelo computador. O sistema universalmente adotado para isso é o hexadecimal ("hexa" para os íntimos), no qual os números utilizam a base 16. Antes de mais nada, esse sistema está suficientemente próximo do decimal para ser tolerado por nós, simples mortais. Mas, além disso, 16 é uma potência de 2. Isso significa dizer que a conversão entre os sistemas – binário e hexadecimal –, nos dois sentidos é extremamente simples. A única dificuldade é que qualquer sistema com base maior do que 10 precisa de novos algarismos, além dos costumeiros decimais (de 0 a 9). De qualquer forma, na base hexadecimal, os dígitos seriam compreendidos entre 0 e 15 (todavia, o próprio 15 utiliza dois dígitos; por esta razão, os dígitos, entre 10 e 15 serão entendidos como A16, B16, C16, D16, E16 e F16). Veja: Decimal: Hexadecimal: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 11 12 13 14 15 A B C D E F Observe, portanto, que o valor máximo de um dígito hexadecimal é 15, representado pelo dígito F (não é letra "F"!). Conhecendo-se a base binária, o valor 15 corresponde a 11112 (=8+4+2+1), portanto, cada 4 dígitos binários correspondem a 1 dígito hexadecimal (por exemplo, o valor binário 010000012, separando-se cada 4 dígitos binários, da direita para a esquerda, ou seja, 0100 0001, obtém-se o valor 41h. No sentido inverso, o valor E9h, corresponde a Eh = 14 = 8+4+2 = 11102 e 9h = 8+1=10012, portanto, E9h2 = 1110 10012). B. Conversão de Bases. B.1. Convertendo de Binário para Decimal (multiplicar os 1s por 2posição deste 1): 3 10002 1102 2 1 0 1 0 0 0 ↓ ↓ ↓ ↓ 23 22 21 20 ↓ ↓ ↓ ↓ 1 x 23 + 0 x 22 + 0 x 21 + 0 x 20 8 1 x 22 + 1 x 21 + 0 x 20 6 B.2. Convertendo de Decimal para Binário (ir dividindo por 2 e, inversamente, pegar os restos): 8 0 2 4 0 2 2 0 2 1 8 = 10002 Outra forma é: Encontre o maior valor possível, igual ou menor que o que deve ser convertido e que corresponda a um valor exponencial de 2 (2n1,2,4,8,16,32,64,128,...) e o preencha com o valor 1. Faça o mesmo com o valor que resta, até que não haja mais resto. B Experimente com 46: 25=32 (46-32=14) + 23=8 (14-8=6) + 22=4 (6-4=2) + 21=2 25 24 23 22 21 20 1 0 1 1 1 0 = 1011102 = 32 0 8 4 2 0 = 32+8+4+2 = 46 Experimente com o valor 127, depois com 235, etc. B.3. Convertendo de Hexa para Decimal (multiplicar os valores por 16posição): F6DA 163 F (15) Fx409 6 = 4CA 162 6 (6) 6x256 161 D (13) Dx16 160 A (10) Ax1 4 C A = = 61440+1536+208+10 = 63194 = 10 x 160 + 12 x 161 + 4 x 162 = 1226 B.4. Convertendo de Decimal para Hexadecimal (ir dividindo por 16 e pegar os restos): 124 16 336 16 124 0 21 16 12 7 = 7Ch 336 = 150h 5 1 C. Operações com Sistema de Numeração Binário. C.1. Adição Binária A adição binária funciona a partir do dígito extremo a direita, obedecendo a seguinte regra: 0 + 0 = 0 ; 0 + 1 = 1 ; . 1 + 0 = 1 ; 1 + 1 = 0, "vai 1" . Observe como essas operações funcionam: vai 1 vai 1 1 + 1 0 inicia-se aqui ! vai 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 Em Decimal: (103 + 34 = 137) C.2. Subtração Binária A subtração binária obedece a seguinte regra: 0 – 0 = 0 , 0 – 1 = 1, 1° “empresta” 1 , 1 – 0 = 1 , 1 – 1 = 0 . No caso de 0-1, antes de calcular, "empresta-se" 1 do dígito à esquerda. Caso não o possua, este próximo dígito emprestará 1 do que está a sua esquerda e assim por diante. Observe o exemplo abaixo, com o cálculo binário 1011001 - 111011: virou (1) 10 (2) 0 0 10 0 10 1 0 1 0 0 1 1 1 0 0 0 1 1 0 Ao invés de 0-1, faz-se 10-1, retirando a "dezena" da esquerda e se, (2) nesta casa, o valor for 0, esta retirará da sua esquerda até haver o 1. (1) 1 1 0 1 0 1 Em Decimal: ( 75 – 54 = 21 ) C C.3. Multiplicação Binária Em cada fase da multiplicação binária, obedece-se a seguinte regra: 0 × 0 = 0 , 0 × 1 = 0 , 1 × 0 = 0 , 1 × 1 = 1 . Veja como isto se aplica no exemplo abaixo: 1 1 1 1 0 1 1 × + 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 Em Decimal: (13 x 11 = 143) C.4. Divisão Binária Na divisão binária, finalmente, é necessário verificar se o divisor cabe no dividendo pelo menos uma vez. Se isto acontecer, o resultado será 1; caso contrário, será 0. Isso faz da divisão uma das operações binárias mais simples. Veja o exemplo: 1 1 0 0 1 1 0 1 - 1 0 1 1 0 1 = 0 0 1 0 1 0 1 - 1 0 1 0 0 Em Decimal: (25 / 5 = 5) = 0 D. Bits e Bytes + Tabela ASCII: Os números binários refletem exatamente o que acontece no computador, ou seja, há ou não corrente elétrica. As instruções ou dados que se dá a ele são codificados em números binários, que, por sua vez, são manipulados e armazenados pelos circuitos internos do aparelho. Assim, quando começa-se a dominar o sistema binário, inicia-se a compreensão de como funciona o computador (ou qualquer máquina binária). Cada um dos dígitos de um número binário é representado eletronicamente dentro do computador por um circuito ligado ou desligado. Se está ligado, o valor é 1. Se pelo contrário, o circuito está desligado, o valor é 0. Cada digito é conhecido como bit (que vem da palavra inglesa Binary digiT). Se o computador trata de números binários, então como distinguir a letra "A" da "B" e assim por diante? É óbvio que um bit sozinho não consegue fazer isto, pois contém o valor 0 ou 1 e só. Portanto, para se conseguir resultados mais significativos, torna-se necessário o agrupamento de vários bits, para que, em conjunto, representem valores maiores. Para facilitar, pode-se comparar um bit com um interruptor de lâmpada que, se na posição 0, a mantém apagada e na 1, acesa. Todavia, para se ter maior liberdade na iluminação, pode-se combinar uma série de interruptores em circuito, os quais controlarão várias lâmpadas entre acesas e apagadas. Em quase todos os micros, os bits estão organizados em "circuitos" de oito, formando o que se conhece como um byte. Cada byte representa, assim, oito dígitos binários (como se fossem 8 interruptores), que portanto pode armazenar qualquer número entre 00000000 e 11111111, ou 128 + 64 + 32 +16 + 8 + 4 + 2 + 1, que corresponde aos valores decimais de 0 a 255. Valores maiores que 255 são representados por dois ou mais bytes. 27 12 8 26 25 24 23 22 21 20 64 32 16 8 4 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 ... 0 1 … 255 Zeros e uns binários foram usados para representar vários números até este ponto. Os bits também podem ser codificados para representar letras do alfabeto, números e sinais de pontuação. Representado pelo American Standard Code for Information Interchange (ASCII), em português é Código Padrão Americano para Troca de Informação. O código ASCII é usado amplamente em sistemas de computadores para transformar os D caracteres comuns do teclado (e alguns incomuns, como os caracteres semi-gráficos, o próprio "<Enter>", o espaço, a tecla <ESC>, etc.) em linguagem de computador. Por causa das inúmeras variações destes caracteres especiais, há vários outros códigos, como o ABNT, o ABNT2, etc. É bom entender que os caracteres digitados num editor de textos moderno (como o WordPerfect, o Word, StarWord, WordPro, AmiPro, etc.) representa um caractere ASCII, porém, como é WYSIWYG (what you see is what you get = o que você vê é o que você obtém), na realidade, é totalmente gráfico, ou seja, incontáveis caracteres "esquisitos" () são mostrados ao invés dos caracteres comuns (por exemplo, ao se digitar a tecla "y", aplicando-se a fonte "Wingdings", o caractere será o ִ, com a fonte "Symbol", ψ, assim por diante). Se, no entanto, qualquer coisa for escrita no modo texto (e não WYSIWYG), como no EDIT do MS-DOS, no editor do Turbo Pascal ou Turbo C ou no Bloco de Notas, os caracteres serão puramente ASCII (e não apenas uma representação). OBSERVAÇÕES: Define-se, portanto, o bit como sendo a menor partícula ("átomo") de uma unidade de informação num computador, e que pode adotar 2 valores ou estados distintos “0” ou “1”. Quanto ao byte, podemos dizer que é um conjunto formado por 8 bits, o que equivale a um caractere (“a”, “b”, “c”, “1”, “2”, “3”, “4”, <ENTER>, <ESC>…), ou seja, o byte é a unidade de informação (assim como kg é a de peso, m de medida, etc.). Pode também ficar mais claro, sabendo-se (ou lembrando-se) que a tabela ASCII contém 256 possíveis caracteres (enumerados de 0 a 255, portanto de 0000 00002 a 1111 11112, ou 0016 a FF16, o que, óbvio, comporta 8 bits, ou 1 Byte, para cada código). EXERCÍCIOS: 1. Converta os seguintes valores para as outras bases numéricas: Decimal Binário Hexadecimal 3127 10111100 F6A Octal 74653 2. Realize os seguintes cálculos: a) 110011 + 01101 b) 110011 x 1101 c) 110011 – 101101 d) 1000010 ÷ 110 3. Considerando que a letra "A" na tabela ASCII corresponde ao código 65, calcule, em hexadecimal: a) MOUSE b) ASCII c) LETRA d) BRASIL E