[Índice] [Capítulo I] [Capítulo III]

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

Porventura você já ficou pensando, alguma vez, porque é que o termo "informática" é usado em conexão com computação? Por outro lado, muitos cursos ou livros de computação rotulam seus assuntos de "processamento de dados". Aqui mesmo nesta apostila, os termos "informática" e "computação" são freqüentemente usados de maneira quase sinônima. Por que?

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

 Você já deve ter percebido, pelo que foi dito até aqui, que há vários 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 dados numéricos são, como o nome indica, dados constituídos por números que deverão, no curso do processamento, ser calculados ou manipulados em operações aritméticas. É importante essa qualificação, porque, como veremos, números também podem fazer parte de outro tipo de dados, os alfanuméricos - só que nesta hipótese não podem ser calculados ou manipulados em operações aritméticas.

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

Muito embora tenhamos estado a falar de dados alfanuméricos, o computador, a bem da verdade, somente processa dados em forma de numérica - e não apenas isso: somente processa dados na forma de NÚMEROS BINÁRIOS (não decimais). Isto pode, à primeira vista, parecer estranho, depois de que acabamos de dizer, e principalmente diante da afirmação, que já fizemos, de que o perfil de utilização dos computadores caminha, cada vez mais, na direção do processamento de dados não-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
Decimal

Cód. ASCII
Binário

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 ASCII

ASCII – 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