Capítulo II - Conceitos Básicos
Eduardo O C Chaves
O nosso objetivo, nesse capítulo, será levá-lo a compreender alguns conceitos básicos para o entendimento do restante da apostila, como, por exemplo, os seguintes:
-- Computação, Informática e processamento de dados;
-- Tipos de dados (dados numéricos, alfabéticos, e alfanuméricos);
-- Organização de dados (caracteres, cadeias de caracteres, campos, registros, arquivos, banco de dados, etc);
-- Sistemas numéricos (sistema decimal, binário, hexadecimal);
-- Representação de dados (código ASCII).
1 - Computação, Informática e Processamento de Dados
O termo "COMPUTAÇÃO" vem do latim. O verbo latino "computare" quer dizer "computar, calcular". Logo, de um ponto de vista etimológico, computação tem que ver com cálculos. Essa idéia é fortalecida por uma análise histórica de aparecimento dos computadores. Você já viu, no Capítulo I, um breve histórico da evolução do computador. Lá ficou claro que os primeiros computadores surgiram para efetuar cálculos complexos, como as fórmulas necessárias para determinar trajetórias balísticas. Durante toda a sua Primeira Geração - até cerca de 1960 - os computadores existentes foram usados quase que exclusivamente em universidades, institutos de pesquisa é órgãos governamentais, para a realização de cálculos científicos e de engenharia.
Assim sendo o termo "computação" tem, etimológica e historicamente, uma forte associação coma realização de cálculos complexos. Não é sem razão, portanto, que muitos imaginam que, para realizar algum trabalho com o computador, ou pelo menos para programá-lo, uma pessoa tem que ser quase gênio matemático. Essa idéia não é verdadeira - e isso ficará demonstrado no Capítulo V, quando tratarmos de programação.
Mas voltamos ao assunto, à medida em que as empresas e os órgãos administrativos do governo foram percebendo o potencial e a utilidade do computador para a geração e manutenção de arquivos e cadastros, e, portanto, para a criação de grandes bancos ou bases de dados ou informações, o perfil de utilização desse equipamento foi sendo pouco a pouco alterado. De uma máquina que principalmente realizava cálculos, ou computava, o computador foi se transformando, pouco a pouco, numa máquina que fundamentalmente armazenava e processava informações - principalmente informações não-numéricas, como dados sobre funcionários de uma firma, dados sobre produtos em estoque, dados sobre reservas nos diversos vôos das companhias aéreas, e assim por diante.
Esse trabalho de armazenamento e manipulação de informações pouco tem que ver com cálculos ou computações. Trata-se, nesse caso, de um trabalho que veio a ser conhecido como PROCESSAMENTO DE DADOS. Como esse processamento de dados não-numéricos era realizado pelos mesmos equipamentos que realizavam os complicados cálculos ou computações exigidos para a pesquisa científica e tecnológicas, os termos "computação e processamento de dados" vieram a se associar. O termo "INFORMÁTICA" de uso mais recente, tem, naturalmente, a mesma raiz que o termo "informação", e refere-se à área ou ciência do tratamento lógico e automatizado das informações.
Estamos falando de processamento de dados, com certa naturalidade, mas o que são DADOS? A resposta mais simples é que dados são informações. Quando alguém lhe pede seus dados pessoais, você geralmente lhe diz seu nome, sua filiação, quando e onde você nasceu, onde estuda ou está empregado, quanto ganha por mês, etc.; etc. Cada uma dessas informações sobre sua pessoa é um dado. O computador, portanto, além de realizar cálculos, processa dados.
Mas o que realmente significa PROCESSAR dados? O termo "processar" tem vários significados. Fala-se em processar alguém na justiça, por exemplo. Este sentido do termo certamente não nos interessa aqui. O sentido do termo que nos interessa é o seguinte: processar alguma coisa é realizar sobre essa coisa uma série de operações, segundo determinados métodos, ou normas, ou regras, ou técnicas. O termo aqui tem que ver com o verbo "proceder", com o substantivo "procedimento": um procedimento é uma maneira de fazer alguma coisa. Processar algo é, portanto, realizar determinadas operações sobre uma coisa de acordo com certos procedimento ou métodos estabelecidos.
Para que possa haver algum processamento - de dados ou qualquer outra coisa - é necessário que haja algum elemento ou ingrediente que se vá processar. O verbo "processar" é transitivo: quem processa sempre processa alguma coisa! É necessário, pois, que haja um ingrediente inicial a ser processado. Depois de processado esse elemento ou ingrediente inicial, haverá um outro elemento, que será o produto do processamento. Logo, todo processamento obedece a um determinado ciclo: ELEMENTOS DE ENTRADA, PROCESSAMENTO, ELEMENTOS DE SAÍDA.
Vamos ilustrar. A tarefa de fazer um bolo é uma excelente ilustração do que seja processamento. Para fazermos um bolo é necessário que tenhamos em mãos os INGREDIENTES INICIAIS, que são, normalmente, farinha, açúcar, ovos, manteiga, fermento, leite etc. Sem ingredientes ninguém vai conseguir fazer um bolo, não é verdade? Com os ingredientes na mão, vamos fazer o que? Processá-los. Processar, acabamos de ver, é realizar uma série de operações sobre esses ingredientes de acordo com alguns procedimentos, métodos, ou regras prodeterminados. No nosso caso, essas operações e esses procedimentos estão contidos na RECEITA do bolo. A receita nos diz o que devemos fazer com os ingredientes: coloque cinco xícaras de farinha em uma tigela; derrame um copo de leite quente em cima da farinha; mexa bem; quebre os ovos e coloque a gema junto com a farinha; as claras bata em neve; etc. Você está vendo como os ingredientes iniciais estão sendo processados? Ao final de todas as operações previstas na receita você terá (ou deverá ter) o bolo, que é o PRODUTO FINAL do processamento.
No caso de processamento de dados o ciclo é o mesmo. Você precisa de ingredientes iniciais, que são comumente chamados de DADOS DE ENTRADA. Sobre esses dados são realizadas operações, previstas em algo semelhante a uma receita, que determina o que deverá ser feito com os dados. Esta a face de PROCESSAMENTO, propriamente dito. Por fim, realizadas as operações, tem-se um produto final, que recebe o nome de DADOS DE SAÍDA.
Note que nem todo processamento de dados tem que ser computadorizado. Na verdade o ser humano vem processando dados e informações desde o início de sua história, e o computador só foi inventado neste século. Quando você olha as suas notas escolares, e faz os cálculos para saber quanto vai precisar no exame final, você está processando dados. As notas mensais são os dados iniciais, e a nota de que você vai precisar o dado de saída. Quando você verifica os pontos ganhos dos vários times em um campeonato de futebol, com a finalidade de determinar quantos jogos o seu time tem que ganhar, para poder ser campeão, você está processando dados.
Na verdade, o cérebro humano é um excelente processador de dados. Talvez o melhor que exista. Vamos dar outros exemplos. Suponhamos que você vá tomar um banho de chuveiro, e a água está muito quente. Você imediatamente sai de baixo, ou abre mais a torneira, ou faz ambas as coisas. O que acontece aqui foi um ciclo completo de processamento de dados. O dado de entrada foi a temperatura da água - muito quente para o seu gosto. Seu cérebro recebeu essa informação, e, com base em alguns outros dados e em alguns princípios já armazenados lá dentro, gravados em sua memória, e derivados de experiências anteriores, processou a informação, dando, como dado de saída, a informação de que você deveria sair de baixo da direção da água, ou abrir mais a torneira, ou ambas as coisas. Fatos como este acontecem a todos os momentos. Você está dirigindo um carro e vê um tremendo buraco na rua - este o dado de entrada. O dado é processado, juntamente com outras informações e princípios já armazenados em seu cérebro, e você aperta o freio, ou desvia para o lado, dependendo de haver ou não haver um outro carro ali ao lado ao seu - este o dado de saída.
Como você pode constatar, o cérebro humano é um processador de informações dos mais possantes. Monitora o funcionamento de seu corpo inteiro, o tempo todo, recebendo informações dos vários órgãos, processando essas informações, e fornecendo outras informações. Se entra um cisco em seu olho, a informação processada e seu olho lacrimeja... alguma substância estranha em suas narinas, a informação é processada e você espirra... Tudo isso é processamento de dados.
Feita a ressalva de que nem todo processamento de dados tem que ser ou é feito via computador, vamos falar agora de processamento de dados via computador. A essas alturas você já deve ter entendido porque o termo "informática" é usado para se referir a área. Em computação estamos lidando fundamentalmente com informações. Mesmo quando estamos realizando cálculos, ou computando, estamos lidando com informações. Uma fórmula matemática é uma receita que determina como deve ser processada uma série de informações - informações numéricas, no caso. É em virtude do fato de que o termo "informática" é mais genérico e abrangente do que o termo "computação" pois cobre, além das informações numéricas, também as não-numéricas, que muitos têm preferido utilizá-lo para se referir à área.
No caso do computador, o processamento de dados é feito segundo uma "receita" que é o PROGRAMA. É o fato de que há uma receita armazenada na memória do computador, que diz o que ele deve fazer em cada caso possível, que dá à operação do computador a automaticidade que se pode observar. (Também o processamento de nosso cérebro é, na maioria das vezes, automático: ele já tem, armazenadas nele, várias receitas sobre o que fazer nas várias hipóteses; é só de vez em quando que ele precisa "parar para pensar"). O programa deve prever que tipos de dados são aceitáveis, que tipos não são, deve estabelecer procedimentos para que os dados aceitáveis sejam introduzidos na memória do computador. deve estabelecer procedimentos para o processamento ou a manipulação dos dados, que levem em conta todos os tipos de dados aceitáveis, deve definir quais os resultados finais que se deseja, de que maneira esses resultados deverão ser apresentados, etc. O programa deve, portanto, ser uma receita completa, que prevê inclusive detalhes como, por analogia, se o bolo dever ser servido frio ou quente, em prato ou bandeja, em pedaços de tamanho x ou de tamanho y, etc.; etc.
O processamento de dados pelo computador é realizado não só automática, mas também eletronicamente. Há varias máquinas que processam informações automaticamente, mas não de maneira eletrônica - e sim, possivelmente, de maneira eletro-mecânica. Máquinas faturadoras, caixas registradoras, etc.; existem as que não são eletrônicas. Essas máquinas certamente processam informações, e algumas delas até automaticamente. O processamento só é eletrônico quando se dá através de circuitos eletrônicos, e não através de equipamentos eletro-mecânicos.
Uma calculadora eletrônica também processa informações de maneira eletrônica. Ela é um computador ou não? Normalmente não se usa o termo "computador" para se referir a uma calculadora eletrônica, embora algumas sejam programáveis - isto é, possam armazenar "receitas" ou programas em sua memória, funcionando automaticamente, depois de programadas - e sejam até capazes de realizar cálculos mais complexos do que os possíveis em muitos microcomputadores. A razão pela qual não se aplica a elas o termo "computador" é que a maioria delas só processa dados numéricos. Quando começam a processar dados numéricos e alfabéticos, então o termo "computador" (microcomputador, computador de bolso, etc.) já passa a ser aplicável a elas.
Terminamos, pois, esta seção, com uma resposta preliminar à questão: O QUE É O COMPUTADOR? O computador é uma máquina que processa dados, tanto numéricos como não-numéricos, eletronicamente, e que pode ser programada para realizar as mais diversas tarefas. Simples, não? Simples e importante. Essa definição já nos indica que o computador não cria informações a partir do nada, não origina informações de si próprio: ele só faz aquilo que nós o instruímos a fazer sobre as informações que nós lhe fornecemos. Ele tem que receber INFORMAÇÕES, tem que receber as INSTRUÇÕES que lhe dizem o que fazer com as informações que recebeu, é, só então, produz RESULTADOS - os resultados que nós o instruímos a fornecer. Isso que dizer que não adianta fazer ao computador perguntas que cuja resposta ele não recebeu as informações e instruções necessárias. Não adianta colocar um "$" diante de um número e esperar que o computador entenda que se trata de cruzeiros, ou de dólares, tratando esse número como um número que pode ter até duas casas decimais, etc. Na verdade, se você colocar um "$" diante de um número, o computador vai imaginar que não se trata de número, pois, como veremos, dados numéricos para ele não contém símbolos estranhos, como o cifrão. Mesmo o que você omita o cifrão, o computador não vai entender que determinado número representa uma quantia de dinheiro, simplesmente porque está relacionada ao preço de uma mercadoria, ou ao salário de alguém. Se você quer que ele faça essas associações , você tem que relacionar essas coisas no programa. Se você quer que determinados valores não sejam calculados além da segunda casa decimal, você deve instruí-lo a truncar os dígitos além da segunda casa. Se, além de truncar, você quer que ele arredonde a segunda casa. Se, além de truncar, você quer que ele arredonde a segunda casa, segundo os parâmetros normais, você tem que instruí-lo a fazer isso. E assim por diante.
Isso mostra que há grande mistério no funcionamento de computador. Há, isto sim, muito trabalho para programá-lo de maneira eficiente e que facilite a vida do usuário. Quanto mais fácil de usar for um programa de computador, tanto mais trabalhosa provavelmente terá sido a sua elaboração. Um programa que lhe oferece várias opções (chamada de "menus", por razões óbvias), que prepara os seus relatórios de maneiras diferentes, à sua escolha, que lhe dá, como usuário, pouco trabalho para aprender a usá-lo, etc. Provavelmente é um programa que deu muito trabalho ao programador, quando de seu desenvolvimento.
Alguém já disse, com propriedade, que o computador é um "ser" completamente ignorante, com uma excelente memória e com uma incrível rapidez no cumprimento de instruções - desde que essas instruções, levando em conta sua ignorância, sejam absolutamente precisas, sem ambigüidade e vagueza, e estejam com linguagem que ele consiga entender.
Mas se é assim que são as coisas, quais as vantagens de utilizar um computador? O parágrafo anterior em parte já respondeu: sua grande capacidade de memória e sua incrível rapidez de processamento. Há mais algumas razões. A despeito do que se propala por muitos críticos do computador, a maioria dos computadores hoje em dia é extremamente confiável. Como já mencionamos, no capítulo anterior, a maioria absoluta dos chamados "erros de computador" não passa de erros de operadores e programadores - isto é, daqueles de quem já se disse que errar é uma de suas características mais comuns: "errar é humano"... Além de sua memória, se sua rapidez, e de sua confiabilidade, há uma outra razão para a grande utilização do computador hoje em dia: sua quase total flexibilidade. Um mesmo equipamento - se bem que, naturalmente, com programas diferentes - pode ser utilizado para processamento de textos, planejamento financeiro e cálculos orçamentários, criação, manipulação e armazenamento de vários tipos de informações, jogos, composição musical, etc.; etc.
Em função disso tudo, não é de se surpreender que os microcomputadores tenham se tornado, hoje em dia, tão populares, a ponto de virarem quase uma mania. Mas falaremos sobre algumas das principais aplicações dos microcomputadores no penúltimo capítulo. Vamos continuar, aqui, falando sobre tipos e organizações de dados.
2 - Tipos de Dados
Basicamente, os dados que classificam em DADOS NUMÉRICOS, DADOS ALFABÉTICOS E DADOS ALFANUMÉRICOS. Vamos falar um pouco sobre estes três tipos.
a - Dados Numéricos
Os números que o computador consegue manipular podem ser de dois tipos principais: números inteiros e números reais. É importante lembrar que esses dois tipos diferentes de dados numéricos tem representações diferentes dentro do computador e são manipulados de forma distinta. Os NÚMEROS INTEIROS, como o nome já deixa entrever, são números não fracionários, e podem ser positivos ou negativos (os negativos representados pelo sinal "-" antes do número). Exemplos de números inteiros são 25, -12, 1990, 0 etc. O armazenamento de números inteiros na memória do computador requer menos espaço, e eles, geralmente. são processados mais rapidamente do que os números reais. Contudo, sua utilidade é limitada, pois muitas aplicações requerem a utilização de números reais.
NÚMEROS REAIS são números que têm, ou podem ter, um componente fracionário, e que em nossa representação contêm uma vírgula, separando a parte decimal. É sempre bom lembrar que a maioria dos computadores, usando o costume dos países de língua inglesa, usa um ponto para separar a parte decimal da parte inteira, e não usa vírgula a não ser para separar dois números. Não se esqueça disso, porque se você, usando um desses computadores, escrever "12,25" o computador interpretará isso como dois números, o número "12" e o número "25", e não como doze inteiros e vinte e cinco centésimos, que teriam que ser escritos assim "12,25". Números reais, como os inteiros, podem ser positivos ou negativos, e a parte fracionária fica sempre armazenada em forma decimal, pois não existem, dentro do computador, mecanismo para armazenar numeradores e denominadores de frações. São exemplos de números reais: 25.8, 125.00, -555.3, etc.
Em algumas aplicações, principalmente na área científica, é necessário uma notação especial - chamada notação científica - para lidar com números muito grandes. No computador, a representação de qualquer número, seja inteiro, seja real, vai somente até um certo número fixo de dígitos (que varia, de máquina para máquina). Assim sendo, quando se quer representar um número muito grande (ou muito pequeno, isto é, uma fração muito pequena) tem que se utilizar uma notação especial, pois esses números normalmente ultrapassam a quantidade de dígitos que podem ser representados dentro do computador. O número inteiro 1234567890 ou número real 0.0123456789 só podem ser representados em notação científica, na maioria dos microcomputadores. A notação científica representa um número dividindo-o em duas partes: uma, chamada de mantissa, contém números base, dentro dos limites de representação do computador;. a outra expressa a potência de 10 pela qual o número base terá que ser multiplicado para se chegar a uma representação aproximadamente do número desejado. Não vamos entrar em maiores detalhes sobre notação científica aqui. A maioria das calculadoras eletrônicas utiliza esse mesmo método. O importante é lembrar que a utilização desse sistema pode levar, freqüentemente, a erros de arredondamento, pois o número original freqüentemente é maior do que o número base que vai ser multiplicado por uma potência de 10. O número inteiro 1234567890 pode ser representado, em notação científica, como 1234567E03, que significa que 1234567 dever ser multiplicado por 10 elevado a 3, que é 1000. O resultado, 1234567000, certamente não é idêntico ao número original - mas, para a maioria das operações, é suficientemente próximo. Para aplicações onde o nível de precisão precisa se estender até várias casas decimais, é necessário utilizar equipamentos que trabalhe com o número elevado de dígitos de precisão. A maior parte dos microcomputadores opera com oito dígitos de precisão, embora alguns cheguem a operar com um sistema de dupla precisão, que atinge até dezesseis dígitos.
B - Dados Alfabéticos
Dados alfabéticos são dados não-numéricos, que contêm apenas caracteres alfabéticos. Exemplos de dados alfabéticos podem ser encontradas em seu nome, em nomes de cidades, estados, países, nomes de produtos, etc.; etc. Não há nenhum problema aqui. Passemos ao próximo.
C - Dados Alfanuméricos
Este tipo de dados, como o nome indica, é composto de caracteres tanto alfabéticos como numéricos. Como já indicamos acima, os números podem ser utilizados pelo computador como se não fossem números, desde que definidos como dados alfanuméricos. Nessa caso, não pode fazer nenhum cálculo com eles. Dados que só contenham caracteres alfabéticos também podem ser definidos como alfanuméricos - não há problema algum nisso, pois os dados alfanuméricos podem conter só caracteres alfabéticos, só caracteres numéricos, ou uma mistura dos dois, como podem incluir ainda caracteres especiais (coisas como $, *, &, etc.). Exemplos de dados alfanuméricos podem ser encontrados em seu endereço ("Rua Augusta, 221"), em números de vôos ("RG 861"), e em muitas outras situações que você pode facilmente imaginar.
Por fim é bom lembrar que em muitas linguagens de programação os dados alfabéticos e alfanuméricos têm que ser representados, na maior parte das vezes, dentro de aspas - simples (‘) ou duplas ("). Algumas linguagens, por outro lado, como BASIC, ignoram a distinção entre dados alfabéticos e alfanuméricos. Tudo o que vem entre aspas é tratado de uma maneira só.
3 - Organização de Dados
Para que o computador possa armazenar e manipular dados com maior facilidade, é conveniente que eles estejam adequadamente organizados.
Pode haver dados que não passem de um CARACTERE apenas. Um tipo sangüíneo, por exemplo, pode ser indicado simplesmente pela letra "A" - e não deixa de ser um dado. O código de ordem de determinado produto pode ser um número de um só algarismo - "8", por exemplo.
A maior parte dos dados, porém, é representada por mais de um caractere. A maioria absoluta dos números tem mais de um dígito, e os dados alfabéticos e alfanuméricos aparecem na forma de CADEIAS DE CARACTERES. Como o próprio nome sugere, trata-se aqui de uma série encadeada de caracteres. O seu nome, por exemplo, é uma cadeia de caracteres, como o é o seu endereço, e um sem número de outros dados.
Quando se vai lidar com números muito grande de dados que estão relacionados entre si, é importante organizá-los de modo a deixar evidente esse relacionamento. Vamos ilustrar com os dados que uma pequena indústria precisa manter. A indústria tem funcionários, e precisa manter informações sobre eles: nome, RG, CIC, números de Carteira de Trabalho, data de nascimento, local de nascimento, endereço, sexo, estado civil, número de dependentes, cargo, salário - digamos que só. O espaço reservado para cada um desses dados específicos é, normalmente chamado de um CAMPO. No caso em pauta, precisaremos de 12 campos, desde que o nome completo seja armazenado em um só campo (seria possível criar um campo para o último nome e outro para outros nomes), e de igual modo o endereço (aqui também seria possível ter um campo para o nome da rua e o número da casa, outro para a cidade, outro para o CEP, etc.). Note que alguns campos serão alfabéticos, outros alfanuméricos, e outros - que estarão envolvidos em cálculos aritméticos, como o número de dependentes, salário-numéricos.
Um conjunto inter-relacionado de campo é freqüentemente chamado de REGISTRO. No caso, o conjunto de todos os campos mencionados seria o registro de um funcionário. Mas como a firma tem mais de um funcionário, ela vai ter mais de um registro - um para cada funcionário, naturalmente. Um conjunto de registros constitui um ARQUIVO.
Mas uma indústria precisa também manter informações sobre, por exemplo, os produtos que tem em estoque - coisas como nome de produtos, código, quantidade em estoque, fornecedor, etc. Nesse caso, precisamos criar mais um arquivo, que conterá vários registros, um para cada produto, os quais incluirão tantos campos quantas forem as informações que queiramos ter sobre os produtos .
A indústria terá ainda vários outros arquivos: Contas a Receber, Contas a Pagar, Dados Contábeis, etc.; etc. É incrível o número de dados, a quantidade de informações, que mesmo uma pessoa apenas consegue acumular - imagine uma empresa de porte razoável! Se esses dados ou informações não estiverem bem organizados, será muito difícil, e talvez até impossível, ter acesso a eles. Mesmo em um fichário individual, de, digamos, mil fichas, ordenadas alfabeticamente, se uma delas é colocada fora de ordem, você terá um trabalho enorme para localizá-la, quando for necessário. De igual forma, se a informação sobre o salário de um funcionário está em um local, a informação sobre o número de seus dependentes em outro, a informação sobre o número de horas extras que ele trabalhou em outro, e assim por diante, ficará muito difícil calcular qual o salário que ele deverá receber no fim do mês do que será o caso de todas essas informações, ou pelo menos a maior parte delas, estiverem no mesmo local.
Um conjunto de arquivos inter-relacionados comumente é chamado BANCO (ou, às vezes, BASE DE DADOS). Bancos de dados de porte razoável só podem ser criados e manipulados por computadores de porte também razoável - embora seja possível, em certas condições, ter acesso a um grande banco de dados, mantido em um equipamento de grande porte, usando um microcomputador, uma linha telefônica, e um aparelho, chamado "modem" (veja o terceiro capítulo), que permite que dados sejam transferidos via linha telefônica.
Para processar dados, é também conveniente, e em alguns casos até indispensável, que os dados sejam organizados de maneira adequada. Isto é feito através do uso de variáveis, vetores, matrizes, etc. Mas esta é uma questão que já extrapola os limites deste livro. Um texto sobre programação deverá lhe fornecer essas informações.
4 - Sistemas Numéricos
O que acontece é que o computador, embora aceite dados alfabéticos, alfanuméricos, e numérico-decimais, e, também, forneça os resultados de seu processamento em forma alfabética, alfanumérica, ou numérico-decimal, conforme o caso, transforma esses dados, antes de processá-los, em números binários, através de um sistema de códigos que existe dentro dele. Segundo o sistema de códigos mais comumente usado em microcomputadores, que é o representado pela Tabela ASCII (ver adiante), cada letra, maiúscula e minúscula, do alfabeto, bem como os numerais 0 a 9, os símbolos especiais, etc.; são todos representados por um código especial, que é número binário, que o computador pode, então sim, processar.
Por causa disso, um entendimento mais profundo de computadores, microprocessadores, e de equipamentos, em geral, que usam circuitos digitais, está diretamente ligado a uma compreensão do sistema numérico binário. Essa compreensão não é necessária para a utilização de microcomputadores. Ela ajuda, isto sim, a entender como eles funcionam. Como muitas pessoas têm interesse em saber como os computadores funcionam. Vamos falar um pouco sobre o sistema numérico binário.
A características distintiva de qualquer sistema numérico é a sua BASE. O sistema decimal, que nós todos usamos, tem base DEZ (de onde, naturalmente, vem o seu nome). O sistema binário de base DOIS (de onde, também, vem o seu nome). A base indica o número de símbolos, ou caracteres, diferentes usados naquele sistema para representar quantidades.
O sistema decimal, com base dez, utiliza dez símbolos diferentes - 0 a 9 - para representar quantidades. O sistema binário, com base dois, utiliza apenas símbolos - 0 e 1 - para representar qualquer quantidade. (O sistema hexadecimal, sobre o qual vamos falar adiante, tem base DEZESSEIS, e utiliza dezesseis símbolos diferentes: 0 a 9 e mais A, B, C, D, E e F, que correspondem, respectivamente, a 10, 11, 12, 13, 14 e 15, no sistema numérico decimal).
Todos esses sistemas (binário, decimal, hexadecimal, bem como outros) se caracterizam também, por serem POSICIONAIS. Isto quer dizer que, nesses sistemas, a posição de um dígito dentro do número é essencialmente importante, porque cada posição representa um determinado peso, quando se quer calcular a magnitude do número. No sistema decimal, você sabe, a primeira posição à direita (o último dígito) equivale a unidades (isto é, o dígito ali tem que ser multiplicado por um); a segunda posição à direita equivale a dezenas (o dígito tem que ser multiplicado por dez); a terceira posição, contando da direita, equivale a centenas ( o dígito tem que ser multiplicado por cem); e assim por diante.
Para calcular a magnitude, ou o valor, de um dado número decimal, todos os dígitos têm que ser multiplicados pelos pesos de sua posição, somando-se depois, os valores alcançados nessas multiplicações para chegar ao valor do número desejado.
Tão acostumados estamos ao sistema decimal, que até nos esquecemos de que é isso que acontece, pois fazemos todos os cálculos automaticamente. Mas um número qualquer, como, por exemplo, 765 é formado da seguinte maneira:
5 vezes 1 = 5
6 vezes 10 = 60
7 vezes 100 = 700
Total = 765
Observe que o peso de cada posição é uma potência da base
1 é igual a 100
10 é igual a 101
100 é igual 102
1000 é igual 103
e assim por diante.
Não se esqueça de que qualquer número elevado à potência 0 é igual à unidade, e de que qualquer número elevado à potência 1 é igual a si mesmo.
Desse modo temos, no sistema decimal, os seguintes pesos para as várias posições
|
106 |
105 |
104 |
103 |
102 |
101 |
100 |
|
1.000.000 |
100.000 |
10.000 |
1.000 |
100 |
10 |
1 |
No sistema decimal, como se vê, o peso de cada posição é exatamente DEZ vezes o peso da posição anterior. Por isso, se você acrescenta um zero à direita de um número decimal, você o está multiplicando por dez, e se você elimina um zero à direita, você o está dividindo por dez.
O sistema numérico binário é semelhante ao sistema decimal por ser também posicional: a posição de um dígito dentro do número também representa um determinado peso, é o valor dos pesos também é fixados em função da base. No sistema binário, o peso de cada posição vale exatamente DUAS vezes o peso da posição anterior. Em outras palavras, aqui também o peso de cada posição é uma potência da base (no caso, uma potência de dois). Por isso, no caso de números binários, o acréscimo de um zero à direita multiplica o número por dois, e a eliminação de um zero à direita divide o número por dois.
Você e eu, acostumados ao sistema decimal, vamos achar o sistema binário muito mais complicado – e, para nós, e mesmo. Só para lhe dar uma idéia, para exprimir cem quantidades, o sistema decimal usa o número 100. O sistema binário, por sua vez, usa o número 1100100. Não parece um despropósito, portanto, o computador utilizar o sistema binário? Acontece, porém, que, para o computador, o sistema binário é o ideal. Daqui a pouco veremos a razão disso. Antes vamos procurar fazer com que você se sinta um pouco mais à vontade com a lógica por detrás do sistema binário.
Você talvez já conheça um velho problema de algibeira expresso mais ou menos assim: se você pudesse ter moedas de qualquer valor, qual o menor número de moedas, e quais os seus valores, que você precisaria ter para formar qualquer quantidade de dinheiro, até mil, sem repetir nenhuma moeda na formação de uma dada quantidade?
Obviamente, precisamos de uma moeda que valha UMA unidade, e também de uma moeda que valha DUAS unidades (pois não podemos repetir moedas, e, portanto, não podemos formar duas unidades usando duas moedas de um). Mas não precisaremos de uma moeda que valha três unidades, pois três pode ser formado com uma moeda de um e uma de dois. Precisamos, no entanto, de uma moeda que valha QUATRO unidades (pois não podemos repetir moedas, não se esqueça). Cinco unidades podem ser alcançadas com uma moeda de quatro e uma de um, seis com uma de quatro e uma de dois, sete com uma de quatro, uma de dois, e uma de um. Já para OITO precisamos de uma nova moeda. As quantidades de nove a quinze podem ser formadas usando as moedas já existentes. Verifique você mesmo. Para DEZESSEIS, porém, não há outro jeito senão criar uma nova moeda. Certo? Já as quantidades de dezessete a trinta e um podem ser formadas com as moedas já existentes, que são as de um, dois, quatro, oito, e dezesseis. Mas vamos precisar de uma moeda valendo TRINTA E DOIS, e depois de uma valendo SESSENTA E QUATRO, de outra valendo CENTO E VINTE E OITO, de outra valendo DUZENTOS E CINQUENTA E SEIS, e de outra valendo QUINHENTOS E DOZE, e ... chega, não é mesmo? Se duvida, tire a prova. Com DEZ moedas com os seguintes valores decimais 1, 2, 4, 8, 16, 32, 64, 128, 256, e 512, podemos formar qualquer quantidade até mil, sem repetir nenhuma moeda. Na verdade, podemos formar qualquer quantidade até um mil e vinte e três – para um mil e vinte quatro precisaríamos de uma nova moeda.
Você certamente deve ter notado que há uma certa ordenação ou lógica entre esses valores das moedas. Cada valor é exatamente o dobro do anterior, não é mesmo? Há uma outra maneira, porém, de expressar a ordenação existente entre os números que representam os valores de nossas moedas: cada um deles é uma potência de dois, não é? Ou vejamos:
1 = 20
2 = 21
4 = 22
8 = 23
16 = 24
32 = 25
64 = 26
128 = 27
256 = 28
512 = 29
Não se esqueça de que qualquer número elevado à potência 0 é igual à unidade, e de qualquer número elevado à potência 1 é igual a si próprio.
Para ficar mais fácil de ler, vamos escrever essas equivalências horizontalmente, colocando o valor mais alto à esquerda:
|
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
|
512 |
256 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Se você quiser formar duzentos e cinqüenta você vai pegar as moedas que valem 128, 64, 32, 16, 8 e 2 – e assim por diante.
Se ao invés de querer contar até mil, você quiser contar até dois mil, basta acrescentar uma nova moeda, valendo MIL E VINTE QUATRO (210) e você poderá contar até dois mil e quarenta e sete. Com uma nova moeda, valendo DOIS MIL E QUARENTA E OITO (211) você poderá contar até quatro mil e noventa e cinco. Com dezesseis moedas, valendo de 20 até 215 ( que é trinta e dois mil, setecentos e oito), você pode contar até o número decimal 65.535 (que é, como você já deve Ter percebido, igual a (216) – 1, pois 216 é igual a sessenta e cinco mil, quinhentos e trinta e seis).
Estabeleçamos uma convenção: quando, para formar alguma quantidade, nós precisamos de uma determinada moeda, multiplicamos o valor dessa moeda por UM (ela continua tendo o mesmo valor, portanto); as moedas de que nós não necessitamos para formar aquela quantidade terão seus valores multiplicados por ZERO (e, portanto, não terão seus valores computados, pois elas não eram necessárias). Com essa convenção, vamos formar de novo a quantidade duzentos e cinqüenta. Como vimos, para tanto precisamos das moedas que valem 128, 64, 32, 16, 8 e 2, e não das outras. Seguindo nossa convenção, teremos o seguinte:
29 (512) vezes 0 = 0 (não queremos a moeda de 512)
28 (256) vezes 0 = 0 (também não queremos a de 156)
27 (128) vezes 1 = 128 (precisamos da moeda 128)
26 ( 64 ) vezes 1 = 64 (também precisamos de 64)
25 ( 32 ) vezes 1 = 32 (precisamos da de 32)
24 ( 16 ) vezes 1 = 16 (precisamos da moeda de 16
23 ( 8 ) vezes 1 = 8 (precisamos da moeda 8)
22 ( 4 ) vezes 0 = 0 (não queremos a moeda de 4)
21 ( 2 ) vezes 1 = 2 (precisamos da moeda de 2)
20 ( 1 ) vezes 0 = 0 (não precisamos da moeda de 1)
TOTAL: 250
Tomando somente os 0s e 1s pelos quais multiplicamos o valor de nossas moedas, valor esse que nada mais é do que a base dois elevada a várias potências, teremos o número binário 0011111010 para expressar o número decimal 250.
Lembra-se de que no início desta seção dissemos que o número decimal 100 era equivalente ao número 1100100 no sistema binário? Vejamos agora a razão disso. No sistema binário, todos os zeros à esquerda do último um, contando-se a partir da direita, podem ser eliminados (do mesmo modo que zeros à esquerda do último dígito significativo, contando-se a partir da direita, da parte não fracionária de um número decimal não significa nada – donde a famosa expressão, "fulano é um zero a esquerda..."). Para formar cem no sistema binário precisamos, portanto, de vários dígitos. Certamente não vamos pegar o dígito binário cujo valor é 128 em decimal (o equivalente à moeda de 128), porque apenas esse dígito já tem valor superior a cem. Pegamos 64, 32, não pegamos nem 16 nem 8, pegamos 4 e não pegamos nem 2 nem 1. Somamos os valores temos 64+32+4= 100, donde cem, em notação binária, se escreve 1100100.
Você pode perguntar como é que sabemos quais dígitos pegar e quais não pegar. Aqui estamos indo mais ou menos na base do chamado método de tentativa e erro. Mais adiante vamos lhe dar uma fórmula de fazer a conversão quase que automaticamente. Saiba, porém, que, para cada quantidade que você imaginar, existe uma, e apenas uma, combinação de 0s e 1s que a representa no sistema numérico binário.
Fácil? Na verdade, nem tanto. Para nós, sempre continuará mais fácil, talvez por costume, talvez por termos dez dedos nas mãos, usar o sistema decimal. Para o computador, porém, o sistema binário é ideal, porque os dois únicos símbolos utilizados , 0 e 1, podem ser representados por dois estados discretos que os componentes e circuitos eletrônicos do computador podem assumir: ligado ou desligado, conduzindo corrente ou não conduzindo corrente, enfim com a simplicidade da língua inglesa "on" ou off". Estes dois estados são equivalentes, para o computador, aos nossos dez dedos. Circuitos de dois estados, ou binários, são pequenos, simples, rápido e econômicos. Podem ter a forma de interruptores ("switches") que, quando estão fechados, ou ligados, representa 1, e quando estão abertos, ou desligados, representam 0, Ou podem ter a forma de transistores que, quando conduzindo energia, representa 1, e quando não conduzindo representa 0. E assim por diante.
Deste modo, com números bastante grande desses interruptores e transistores, que, miniaturizados ao extremo, ocupam espaços incrivelmente pequenos, podemos representar uma série bastante grande de números e códigos, com muita simplicidade (simplicidade, bem entendido, para o computador, não necessariamente para nós).
Na verdade, para facilitar um pouco as coisas, os computadores trabalham com números binários de tamanho limitado. A maioria dos microcomputadores hoje existentes trabalha com números binários de OITO DÍGITOS. No jargão computacional, cada dígito binário é chamado de "BIT" (que nada mais é do que o comecinho da palavra "Blnary" e o finzinho da palavra "digiT"), e cada grupo de oito "bits" é chamado de um "BYTE". (Na verdade, um byte é o número de bits necessários para armazenar ou representar um caractere alfabético. Nos microcomputadores de hoje, porém, um byte é sempre um grupo de oito bits).
Porque os números binários com que o computador opera representam não só números, propriamente ditos, mas também códigos de caracteres alfabéticos e especiais, etc., freqüentemente se refere a esses números binários como PALAVRAS BINÁRIAS, que é uma expressão mais genérica, que pode se aplicar tanto a números como a letras, caracteres especiais, códigos de controle, etc. Diz-se, então, freqüentemente, que o computador opera com palavras binárias.
Todos os microcomputadores funcionam com PALAVRAS BINÁRIAS DE TAMANHO FIXO, e, como acabamos de mencionar, a maioria dos microcomputadores ainda opera com palavras binárias de oito bits (ou seja, de um byte). Já há vários microcomputadores, porém, operando com palavras de dezesseis bits (ou dois bytes), e mesmo com palavras de trinta e dois bits (ou quatro bytes), originalmente só existentes em minicomputadores. Isso está tornando cada vez mais difícil estabelecer uma distinção muito nítida e clara entre microcomputadores e minicomputadores.
O que se quer dizer quando se fala que um microcomputador opera com palavras de oito bits? Quer-se dizer que toda forma de manipulação de dados (i.e., toda transmissão, todo armazenamento, todo processamento, ou qualquer outra forma de manipulação de dados) é executada em blocos de oito bits.
Naturalmente, o número de dígitos, ou bits, em uma palavra binária determina o valor (decimal) mais alto que aquela palavra pode representar. O valor decimal mais alto que uma dada palavra binária pode representar é dado pela fórmula:
MAX = (2N) – 1
Aqui N é o número de bits daquela palavra. Assim sendo, uma palavra de oito bits pode representar o valor decimal máximo de 255, porque 28 = 256. Note bem que uma palavra de oito bits pode representar 256 valores diferentes, dos quais 255 é o mais elevado, e isto porque 0 é também um valor válido.
|
Números de Bits (N) |
Quantidade máxima de números binários (2N) |
|
1 2 3 4 5 6 7 8 |
2 4 8 16 32 64 128 256 |
Lembre-se de nossas moedas. A quantidade máxima, em decimal, que as oito primeira moedas podiam formar era 255. Para chegar a 1.023 precisamos de dez moedas. Portanto, para representar um mil e vinte e quatro números diferentes, de 0 a 1.023, usando uma palavra binária só, precisamos de uma palavra de dez bits – mas para representar o número decimal 1.024 precisamos de uma palavra de onze bits.
Por aí se vê que uma palavra de oito bits restringe consideravelmente o escopo dos números que podem ser manipulados pelo computador. Essa restrição geralmente é contornada usando-se mais do uma palavra para representar um número. Por exemplo, usando-se duas palavras de oito bits para representar um número, podemos colocar os oito bits mais significativos (os da esquerda) em um byte e os oito dígitos menos significativos (os da direita) em outro byte. Dessa forma o computador pode representar sessenta e cinco mil, quinhentos e trinta e seis (216) números diferentes, ou seja, os números que vão de 0 a 65.535.
Mas isso será objeto de discussão mais detalhada no capítulo seguinte, que trata de hardware. Vamos falar aqui, um pouco mais, do sistema numérico binário e relacioná-lo a um outro sistema numérico com o qual você, fatalmente, virá a ter algum contato em suas leituras sobre computação: o sistema hexadecimal.
Usando apenas dois dígitos diferentes, torna-se difícil, para nós, memorizar e manipular números binários. À vista disso, várias técnicas foram desenvolvidas para facilitar o seu uso. Uma dessas técnicas envolve a utilização do sistema numérico hexadecimal.
O sistema hexadecimal, como já mencionamos, tem base DEZESSEIS. Usa, portanto, dezesseis símbolos diferentes, que são caracteres 0 a 9 a F. As letras A a F representam, respectivamente, os números dez, onze, treze, quatorze, e quinze. O número dezesseis, que representa a base, é, no sistema hexadecimal, 10. (Note bem: no sistema decimal, o número 10 representa a base, ou seja, dez; no sistema binário, 10 representa dois, que é a base; no sistema hexadecimal 10 também representa a base, que aqui é dezesseis. Temos, no caso, uma regra geral: nos sistemas numéricos, a combinação de dígitos "10" representa sempre a base, qualquer que ela seja).
Os sistemas binários e hexadecimal são relacionados – isto é, são meio "parentes", e isso porque a base do sistema hexadecimal, dezesseis, é uma potência de 2 – a saber, 24. Usando-se, portanto, apenas quatro bits de um número binário (usando-se, portanto, a metade de um byte que às vezes é chamada de um "nibble" – computacionistas têm razoável senso de humor, de vez em quando: a palavra inglesa "bite", com "I", quer dizer "mordida", "bocado"; a palavra "nibble" quer dizer "mordidinha", "bocadinho"; conseqüentemente, quando se precisou de um termo para se referir à metade de um "byte", agora com "y", apelou-se à palavra "nibble"!). Podemos definir dezesseis números diferentes (que são os dezesseis símbolos do sistema hexadecimal). Memorize a seguinte tabela:
| Decimal | Binário | Hexadecimal |
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
(NOTA: Observando a formação dos números binários desta tabela, você certamente deve ter percebido qual a regra de sua formação – que é idêntica à regra de formação dos números decimais e hexadecimais. Começando da direita para a esquerda, quando um determinado dígito alcança o valor mais alto que um dígito pode ter naquele sistema – que é 1 no caso do sistema binário, 9 no decimal, e F, isto é quinze, no hexadecimal – o número seguinte é formado fazendo com que o dígito à esquerda do dígito que alcançou valor máximo tenha o menor valor possível, exceto zero – que é 1 nos três sistemas – e o dígito que havia alcançado valor máximo de transforme em 0. Assim, o número seguinte a 1 no sistema binário é 10, que representa dois; o número seguinte a 9 no sistema decimal é 10, que representa dez; o número seguinte a F, no sistema hexadecimal, é 10, que representa dezesseis. No sistema binário, o número seguinte 1111 – que representa quinze – é 10000 – que, naturalmente representa dezesseis.)
|
Potência |
Representação Numérica |
Valor em Decimal quando Base = 2 |
Valor em Decimal quando a base = 10 |
Valor em Decimal quando Base = 16 |
|
Base0
Base1 Base2 Base3 Base4 Base5 Base6 Base7 |
00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 |
1 2 4 8 16 32 64 128 |
1 10 100 1.000 10.000 100.000 1.000.000 10.000.000 |
1 16 256 4.096 65.536 1.048.576 16.777.216 268.435.456 |
Para usar o sistema hexadecimal para simplificar a representação de números binários, divide-se o número binário em grupos de quatro bits, começando-se da direita, ou do chamado LSB – "least significant bit", ou dígito menos significativo – para a esquerda da direção do MSB – "most significant bit", ou dígito mais significativo. Substitui-se, então, cada um dos grupos de quatro bits por seu correspondente hexadecimal. Assim, o número binário 1111000111011 é convertido para hexadecimal da seguinte maneira.
1 1110 0011 1011
1 E 3 B
Certamente é mais fácil, apesar das letras esquisitas que aparecem no meio, memorizar o número "1E3B" do que "1111000111011", não é mesmo?
Para converter um número hexadecimal em binário, use o sistema inverso. Quanto é em binário, o número hexadecimal "FF"?
F F
1111 1111
"FF" em hexadecimal é igual a "11111111" em binário. Se você se lembra da história de nossas moedas, 11111111 em binário equivale a 255 em decimal, que, por sinal, é o número decimal mais alto que pode ser representado por um byte, ou oito bits. Certamente você não se esqueceu disso ainda!
Aprendemos, portanto, como é que se converte um número binário em um hexadecimal, e vice-versa. Mas como é que se converte um número binário em decimal, e um decimal em binário? E como se converte um número hexadecimal em decimal, e vice-versa? Talvez a melhor maneira de converter um número hexadecimal em número decimal, e vice-versa, seja convertendo o número original em binário, em primeiro lugar, e depois convertendo o número binário para o sistema desejado.
Assim sendo, vamos ver como é que se transforma um número binário em decimal e um decimal em binário. Na verdade, você já viu como se converte um número binário em decimal: quando o dígito é 0, ignora-se o valor de sua posição; quando é 1, soma-se o peso de sua posição. É assim que se obtém o valor decimal 255 a partir do número binário 11111111: neste caso, somam-se todos os pesos das oito primeiras posições, e o total é duzentos e cinqüenta e cinco.
O processo inverso é um pouco mais complicado. Para converter, por exemplo, o número decimal 223 em binário, devemos dividi-lo, consecutivamente, por dois, e anotar os restos, até que o quociente seja zero.
O número decimal 223 é, portanto, 11011111 em binário.
NOTA IMPORTANTE: O último resto apurado é o MSB – dígito mais significativo – do número binário; o primeiro resto apurado é o LSB – dígito menos significativo – do número binário, e, portanto, aquele que fica mais à direita. Em caso de dúvida, lembre-se de que o primeiro resto apurado é o que vai determinar se o número é par ou ímpar, é, portanto, deve ser o dígito mais à direita.
Logo, o número decimal 128 é igual ao número binário 1000000. Como a posição do oitavo bit tem peso cento e vinte e oito, e todos os outros bits estão "zerados", você pode constatar que a conversão está correta.
É possível fazer operações aritméticas usando números binários. As operações mais comuns são adição e subtração, e, portanto, vamos nos limitar a elas.
A adição ou soma de dois números binários é muito simples e segue os mesmos princípios da adição de números decimais. Vejamos alguns exemplos:
(a) Somemos os números binários 1 e 1
1 ("vai um") 1
1
---
10
10, em binário, naturalmente, equivale a dois, em decimal. 1 mais 1, em binário, é igual a dois – mas não existe um símbolo para representar dois de modo que se usa o 0 e se "leva" 1 ("vai um") para a próxima seção, que naturalmente, fica apenas com o 1, porque não tinha nada – estava vazia. (Comparece com a adição, em decimal, de 5 e 5: cinco mais cinco é igual a dez – mas não há nenhum símbolo que represente dez no sistema decimal; então se coloca um 0 e se leva 1 para a próxima posição, ficando, o resultado, igual a 10).
(b) Somemos os números binários 111011011 e 1100001
1111 11 ("Vai um") 111011011
1100001
----------------
1000111100
Entendeu o princípio? O primeiro número equivale ao número decimal 475 e o segundo equivale ao número decimal 97. O total, naturalmente, equivale ao decimal 572.
(c) Somemos os números binários 1111m e 1111
1111
1111
1111
-------
11110
Fácil, não é?
A subtração com números binários pode parecer um pouco mais complicada, porque ela é feita usando-se a soma do complemento ou soma do número negativo (que, no caso de números binários, virtualmente se identificam). Para facilitar a compreensão, imaginemos que, no sistema decimal, só pudéssemos somar – mas tivéssemos números negativos! 50-40 seria igual a 50+(-40). Ambas as operações produzem exatamente o mesmo resultado, que, naturalmente, é 10. 80-60, em mais um exemplo, seria equivalente a 80+ (-60), ou seja, 20.
Vamos dar um passo adiante, porém. Ao invés de usar o número negativo, usemos o completo do número que está sendo subtraído – o subtraendo. O completo de um número é o que falta esse número para atingir a potência da base que lhe é imediatamente superior. No caso de 40, seu complemento é o que lhe falta para atingir a potência de 10 que lhe é imediatamente superior, a saber, 100: o complemento de 40 é, portanto, 60. 50-40 seria, por este método, equivalente (que é potência da base utilizada para se encontrar o complemento do subtraendo): 50+60-100= 10. No caso do outro exemplo, o complemento de 60 é 40. Logo, 80-60 é equivalente a 80+40-100 – que é igual a 20.
No caso de números binários, o princípio é o mesmo. O número decimal 5 se escreve 101 em binário. Qual é o seu complemento? Vamos operar também com os equivalentes em decimal para simplificar as coisas. Se você se lembra do que dissemos há pouco, saberá que a potência da base dois que é imediatamente superior a 101 (5 decimal) é 1000 (8 decimal). Logo, o complemento de 101 deverá ser 11 (3 decimal). Outro exemplo: o complemento de 1100 (12 decimal) é o que falta a esse número para chegar à potência da base que lhe é imediatamente superior, a saber, 10000 (16 decimal), e é, portanto, 100 (4 decimal.)
Esse o princípio. Na verdade, na prática as coisas são bem mais simples, porque há uma regrinha que facilita muito as coisas. Para achar o complemento de um número binário qualquer, basta alterar todos os 1s para 0s e todos os 0s para 1s, e depois somar 1 ao total. Quer ver como funciona? O número 5 decimal, como vimos, é 101 em binário. Para achar seu complemento, aplique a regrinha e teremos 010, que, somando-se 1, é igual a 011 – ou seja, a 3 decimal. No outro exemplo temos o número decimal 12, que é 1100, em binário. Para achar seu complemento, transformemos os 1s em 0s e vice-versa, e teremos 0011. A este número somemos 1 e teremos 100 (que é 4 decimal) – você certamente ainda se lembra de como se soma em binário, não é verdade?
Para subtrair números binários, portanto, soma-se ao minuendo o complemento do subtraendo – que é achado depois de igualadas as casas! 110011 – 1101 será igual a 110011 + 110011, que é igual a 1100110 – que certamente é incorreto, porque o resultado é maior do que qualquer um dos números originais! O que você tem que fazer é desprezar o MSB – dígito mais significativo – ficando o resultado 100110 (em decimal, 51-13= 38). A razão para desprezar o MSB é idêntica à que determina, no caso dos exemplos de subtração via soma do complemento em decimal, que vimos acima, que se subtraia 100 antes de se ter o resultado correto. Subtrai-se a potência da base que foi utilizada para encontrar o complemento do subtraendo.
Até que não é tão complicado assim, não é mesmo?
Antes de falar um pouquinho na Tabela ASCII, como prometemos, precisamos explicar como é que o computador lida com números negativos. Quando usamos números decimais, simplesmente colocamos um sinal à esquerda do número. Com números binários fazemos a mesma coisa – só que o hardware do computador não entende logo como um " – ". Por isso se convencionou que o bit mais significativo – primeiro à esquerda – representa, a via de regra, o sinal. Se este bit é 0, o número é positivo, se é 1, o número é negativo. Só que há uma complicação ainda: para representar um número negativo, não só se coloca o sinal (que é MSB = 1) mas também se transforma o número em seu complemento!
Exemplos, usando sempre oito bits para imprimir um número. O número decimal 35 seria expresso em binário por 00100011; o número negativo – 35 seria expresso por 11011101. O número decimal 127 é expresso em binário por 01111111; o número negativo – 127 é expresso por 10000001. O número binário 00000000 é igual, naturalmente, a 0. O número binário 10000000 é igual a – 128. Por quê? Usando apenas sete dígitos para expressar um número – o oitavo expressa o sinal – o maior número que pode ser expresso é 127, que é 01111111, como vimos. – 127 é expresso mudando-se o MSB para 1 e achando-se o complemento de 1111111, que é 0000001. Logo, - 127 é igual a 10000001. Como 128 não pode ser expresso em sete bits, mas haveria condições de se exprimir 0 e –0 (o que naturalmente não faz sentido), convencionou-se que o complemento de 0 é igual a – 128. 0 é 00000000. Seu complemento seria 11111111+1, que dá 00000000, desprezando-se o MSB. Colocando-se o sinal, temos 10000000 para –0, ou – 128.
Certamente você deve ter notado um problema aqui. Acabamos de dizer que 1000001 é igual a – 127. Mas olhando lá atrás, quando fornecemos aquelas tabelas, no exemplo das moedas, você poderá concluir que 10000001 é igual a 129. Como é que se distingue – 127 de 129? Na verdade, a responsabilidade pela distinção fica nos ombros do programador. É ele que deve determinar se os números binários com que ele está operando representam apenas números positivos ou podem representar tanto números positivos quanto números negativos. No segundo caso, o MSB representa o sinal. O computador vai apenas exibindo uma certa seqüência padrão nos bits de um byte, à medida em que se acrescenta 1 ao número anterior. Começa com 0, vai indo de um em um até 01111111 – que é 127. O padrão seguinte é 10000000, que pode representar tanto 128 como – 128, dependendo de como se interpreta o MSB: se como dígito significativo ou como sinal. O padrão seguinte é 10000001, que pode representar tanto 129 como – 127, dependendo de como se interpreta o MSB. Daí em diante o padrão é o mesmo: 10000010 é ou 130 ou – 126. Se o MSB representa um dígito significativo, 11111111 vai representar 255. Se representa sinal, 11111111 representará –1. Entendeu a lógica? Compreendeu por que a responsabilidade é do programador?
Caso você esteja tendo dificuldades em entender por que 11111111 pode ser –1, veja bem: um é igual a 00000001, em binário. Seu complemento é 11111110+1= 11111111. Logo, se o MSB representa o sinal, 11111111 é igual a –1.
TABELA DE CONVERSÃO DE NÚMEROS HEXADECIMAIS EM DECIMAIS
|
HEXA=DECIM 0000 = 00000 1111 = 04369 2222 = 08738 3333 = 13107 4444 = 17476 5555 = 21845 6666 = 26214 7777 = 30583 8888 = 34952 9999 = 39321 AAAA = 43690 BBBB = 48059 CCCC = 52428 DDDD= 56797 EEEE = 61166 FFFF = 65535 |
HEXA=DECIM 0000 = 00000 1000 = 04096 2000 = 08192 3000 = 12288 4000 = 16384 5000 = 20480 6000 = 24576 7000 = 28672 8000 = 32768 9000 = 36864 A000 = 40960 B000 = 45056 C000 = 49152 D000 = 53248 E000 = 57344 F000 = 61440 |
HEXA=DECIM 0000 = 00000 0100 = 00256 0200 = 00512 0300 = 00768 0400 = 01024 0500 = 01280 0600 = 01536 0700 = 01792 0800 = 02048 0900 = 02304 0A00 = 02560 0B00 = 02816 0C00 = 03072 0D00 = 03328 0E00 = 03584 0F00 = 03840 |
HEXA=DECIM 0000 = 0000 0010 = 00016 0020 = 00032 0030 = 00048 0040 = 00064 0050 = 00080 0060 = 00096 0070 = 00112 0080 = 00128 0090 = 00144 00A0 = 00160 00B0 = 00176 00C0 = 00192 00D0 = 00208 00E0 = 00224 00F0 = 00240 |
HEXA=DECIM 0000 = 00000 0001 = 00001 0002 = 00002 0003 = 00003 0004 = 00004 0005 = 00005 0006 = 00006 0007 = 00007 0008 = 00008 0009 = 00009 000A = 00010 000B = 00011 000C = 00012 000D = 00013 000E = 00014 000F = 00015 |
Lembre-se do que dissemos acima: um número binário de oito bits pode representar duzentos e cinqüenta e seis números diferentes – normalmente, os números decimais de 0 a 255. Se você quiser manter controle de números negativos, porém, o MSB se torna o sinal – mas você ainda pode representar duzentos e cinqüenta e seis números com oito bits, a saber, os números positivos de 1 a 127, os números negativos de –1 a –128, e ainda o 0 (127+128+1=256 números).
É por causa disso que muitos microcomputadores, ao lidar com números inteiros, podem representar apenas 65.536 números, porém, não são 0 a 65.535. como seria de se esperar, mas, isto sim, 0, 1 a 32.767 e –1 a –32.768 – total 65.536.
5 - Representação de Dados da Tabela ASCII
A chamada Tabela ASCII – "American Standard Code for Information Interchange" – é o mais popular esquema de codificação usado atualmente para representar os vários caracteres normalmente presentes em um teclado, bem como uma série de funções de controle. Fornecemos adiante a Tabela ASCII padrão. Você pode notar que há apenas espaço para cento e vinte e oito códigos, visto não se usar o bit mais significativo. Alguns fabricantes de microcomputadores usam versões um pouco diferentes da Tabela ASCII padrão, fazendo uso dos oito bits – e fornecendo, portanto, códigos para duzentos e cinqüenta e seis caracteres ou funções de controle. Entre os códigos adicionais geralmente estão incluídos códigos para controle de cores, de caracteres gráficos, etc.
Você pode notar que apenas os códigos 0 e 9 têm uma contrapartida lógica na Tabela ASCII: os quatro dígitos binários menos significativos do código ASCII correspondem aos dígitos 0 a 9. Para os outros caracteres não há nenhuma correspondência.
Assim sendo, quando você escreve no teclado do computador a expressão "HOJE E DOMINGO", o teclado envia ao computador uma série de números binários, que correspondem aos códigos dos caracteres cujas teclas você apertou. Com base nesses números, que são os códigos ASCII, seu computador provavelmente mostrará na tela os caracteres correspondentes. No caso da expressão "HOJE E DOMINGO" (escrita em maiúscula – há códigos diferentes para letras minúsculas), os códigos são, em decimal, os seguintes: 72, 79, 74, 69, 32 (códigos para espaço, não esqueça!), 69, 32 (outro espaço), 68, 79, 77, 73, 78, 71, 79. Se você quisesse colocar um ponto final, o código 46 teria que ser acrescentado ao final. Usando os códigos em binário, teríamos o seguinte:
|
Caractere |
Cód. ASCII |
Cód. ASCII |
|
H |
72 |
1001000 |
|
O |
79 |
1001111 |
|
J |
74 |
1001010 |
|
E |
69 |
1000101 |
|
32 |
0100000 |
|
|
E |
69 |
1000101 |
|
32 |
0100000 |
|
|
D |
68 |
1000100 |
|
O |
79 |
1001111 |
|
M |
77 |
1001101 |
|
I |
73 |
1001001 |
|
N |
78 |
1001110 |
|
G |
71 |
1000111 |
|
O |
79 |
1001111 |
|
46 |
0101110 |
Se o seu teclado permitir a manipulação de letras minúsculas, acrescente 32 a cada um dos códigos correspondentes aos caracteres alfabéticos (os códigos do espaço e do ponto continuam os mesmos) e você provavelmente terá letras minúsculas.
Mesmo que um microcomputador não utilize a Tabela ASCII padrão para seu funcionamento interno, ele provavelmente vai precisar de um programa que lhe permita comunicar-se nesse código padrão com a maioria das impressoras, com outros computadores, etc. Por isso é bom ter algum conhecimento não só do código de conversão do microcomputador que você usa mas também do código padrão.
Com essas considerações chegamos ao final deste longo capítulo sobre conceitos básicos. Passemos ao capítulo seguinte, onde discutiremos hardware – o equipamento propriamente dito.
onjunto de Caracteres-Padrão do Código ASCIIASCII – American Standard Code for Information interchange
| Caractere |
Valor Decimal |
Valor Hexadecimal |
Valor Binário |
Descrição |
|
NUL |
000 |
00 |
0000000 |
NULI |
|
SOH |
001 |
01 |
0000001 |
Start Of Heading |
|
STX |
002 |
02 |
0000010 |
Start TeXt |
|
ETX |
003 |
03 |
0000011 |
End TeXt |
|
EOT |
004 |
04 |
0000100 |
End Of Transmission |
|
ENQ |
005 |
05 |
0000101 |
ENQuiry |
|
ACK |
006 |
06 |
0000110 |
ACKnowledge |
|
BEL |
007 |
07 |
0000111 |
BELI |
|
BS |
008 |
08 |
0001000 |
BackSpace |
|
HT |
009 |
09 |
0001001 |
Horizontal Tab |
|
LF |
010 |
0A |
0001010 |
Line Feed |
|
VT |
011 |
0B |
0001011 |
Vertical Tab |
|
FF |
012 |
0C |
0001100 |
Form Feed |
|
CR |
013 |
0D |
0001101 |
Carriage Return |
|
SO |
014 |
0E |
0001110 |
Shiff Out |
|
SI |
015 |
0F |
0001111 |
Shiff In |
|
DLE |
016 |
10 |
0010000 |
Data Link Escape |
|
DC1 |
017 |
11 |
0010001 |
Direct Control 1 |
|
DC2 |
018 |
12 |
0010010 |
Direct Control 2 |
|
DC3 |
019 |
13 |
0010011 |
Direct Control 3 |
|
DC4 |
020 |
14 |
0010100 |
Direct Control 4 |
|
NAK |
021 |
15 |
0010101 |
Negative AcKnowledgement |
|
SYN |
022 |
16 |
0010110 |
SYNchronous idle |
|
ETB |
023 |
17 |
0010111 |
End Transmission Block |
|
CAN |
024 |
18 |
0011000 |
CANcel |
|
EM |
025 |
19 |
0011001 |
End of Medium |
|
SUB |
026 |
1A |
0011010 |
SUBstitute |
|
ESC |
027 |
1B |
0011011 |
ESCape |
|
FS |
028 |
1C |
0011100 |
Form Separator |
|
GS |
029 |
1D |
0011101 |
Group Separator |
|
RS |
030 |
1E |
0011110 |
Record Separator |
|
US |
031 |
1F |
0011111 |
Unit Separator |
|
SP |
032 |
20 |
0100000 |
Space |
|
! |
033 |
21 |
0100001 |
Ponto de Exclamação |
|
" |
034 |
22 |
0100010 |
Aspas |
|
# |
035 |
23 |
0100011 |
Número |
|
$ |
036 |
24 |
0100100 |
Cifrão |
|
% |
037 |
25 |
0100101 |
Porcentagem |
|
& |
038 |
26 |
0100110 |
"E" Comercial |
|
‘ |
039 |
27 |
0100111 |
Apóstrofo |
|
( |
040 |
28 |
0101000 |
Parêntese à esquerda |
|
) |
041 |
29 |
0101001 |
Parêntese à direita |