Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
27/06/2005

< Computadores II: Bits e Bytes >


Sistemas numéricos posicionais

Pode-se escrever um livro sobre esse tema. Mas um livro não caberia aqui. Por outro lado, não dá para discutir computadores sem abordar a forma pela qual internamente eles lidam com números e as razões dessa forma ter sido adotada. Então vamos abordar o assunto de forma extremamente superficial, apenas tangenciando os conhecimentos estritamente necessários para continuarmos nossa viagem pelo interior dos computadores.

Todo o mundo sabe o que são “números”. O que pouca gente sabe é definir o que é um “número”. Segundo a definição corrente, baseada na teoria dos conjuntos, “número é o conjunto de todos os conjuntos equivalentes entre si”. Então, o número cinco, por exemplo, é o conjunto de todos os conjuntos de cinco elementos.

A definição pode ser um tanto complicada, mas afinal, o conceito de número está bem arraigado em nossas consciências. Se precisarmos de uma definição mais compreensível (embora menos correta do ponto de vista teórico) sempre podemos usar o conceito vulgar: “um número é aquilo que exprime uma quantidade de qualquer coisa”. Ou algo parecido...

Já um sistema numérico é uma forma sistemática de representar números, uma definição mais fácil de entender. Há diversas formas de fazer isso. Nos interessam especificamente os sistemas numéricos posicionais.

Um sistema numérico posicional é aquele em que o valor do “algarismo” ou “numeral” (representação gráfica ou símbolo de um número inferior à base) depende da posição deste algarismo no interior da representação do número (conjunto de algarismos). O sistema numérico que usamos correntemente, o sistema decimal (que adota a “base” dez), é posicional. Por exemplo: no número 32.524 do sistema decimal, o primeiro   algarismo “ 2” (contando a partir da direita) vale vinte unidades, enquanto o segundo vale duas mil unidades. Seus valores variam devido à posição que ocupam na representação do número.

A razão disso é que, em um sistema numérico posicional como o sistema decimal, cada algarismo (ou “numeral”) tem um valor igual ao do próprio algarismo multiplicado pela “base” elevada à posição ocupada pelo número. As posições são numeradas da direita para a esquerda a partir de zero. Então, sempre lembrando que o sistema decimal usa a base dez, consegue-se o valor do número 32.524 somando as seguintes parcelas (obtidas considerando os algarismos tomados da direita para a esquerda):

4 multiplicado por 10 (base) elevado à potência 0 (posição 0) = 4 x 1 = 1

2 multiplicado por 10 (base) elevado à potência 1 (posição 1) = 2 x 10 = 20

5 multiplicado por 10 (base) elevado à potência 2 (posição 2) = 5 x 100 = 500

2 multiplicado por 10 (base) elevado à potência 3 (posição 2) = 2 x 1.000 = 2.000

3 multiplicado por 10 (base) elevado à potência 4 (posição 4) = 3 x 10.000 = 30.000

A soma, naturalmente, resulta em 32.524. E basta reparar a forma pela qual o número dez foi utilizado na obtenção do valor do número para entender porque ele é a “base” do sistema numérico.

Pode-se usar qualquer número como base para criar um sistema numérico posicional. Basta seguir a regra acima delineada: obtém-se o valor do número multiplicando-se o valor de cada numeral pela base elevada à posição ocupada por ele e somando todas as parcelas. E se você reparar, vai descobrir que outras bases foram usadas na história da humanidade. O agora quase abandonado sistema inglês de medidas, onde um pé vale doze polegadas e um jarda vale doze pés, é indício do uso de um sistema numérico de base doze. Assim como o fato de até hoje bananas serem vendidas às dúzias e a existência do valor “grosa” (144, ou doze dúzias). E os nomes dos números em francês, onde oitenta é “quatre-vignts” (quatro vintes) e 78 é “soixante-dix-huit” (sessenta e dezoito) são pistas seguras de que algum dia se usou um sistema de base vinte. Na verdade, ao que parece, a única razão para usarmos o sistema decimal é o fato de termos dez dedos nas mãos e a maioria de nós haver aprendido a contar com eles (em ambos os sentidos). Mas qualquer outro número pode ser usado como base. Desde que se observe um detalhe: um sistema de base “X” precisará de “X” algarismos (ou “numerais”) para representar os números.

Assim, o sistema decimal usa dez algarismos (de zero a nove), o sistema de base oito adotará oito (de zero a sete) e o sistema de base dezesseis, muito usado em informática, necessitará de dezesseis algarismos (os mesmos zero a nove do sistema decimal ao qual se agregaram os símbolos “A”, “B”, “C”, “D” “E” e “F” para representar os algarismos de dez a quinze).

Ora, se pode-se usar qualquer número como base, e dois é um número como qualquer outro, também ele pode ser usado como base de um sistema numérico posicional.

E de fato o é. O sistema numérico posicional de base dois chama-se “sistema binário” e utiliza, naturalmente, apenas dois algarismos, o zero e o um.

Sistema binário; bits e bytes

Computadores são constituídos internamente por circuitos elétricos ou eletrônicos.

A grande maioria dos componentes de circuitos elétricos podem assumir apenas um dentre dois estados. Por exemplo: interruptores (ou transistores, se usados como “chaveadores de corrente”) podem estar fechados ou abertos; capacitores podem estar carregados ou descarregados; lâmpadas podem estar acesas ou apagadas; circuitos podem estar energizados ou desenergizados; e assim por diante.

Se estabelecermos que um desses estados representa o “um” e que o outro representa o “zero”, tais dispositivos podem ser usados para representar números expressos no sistema binário, o sistema numérico posicional de base dois que usa apenas os algarismos, “um” e “zero”.

O uso do sistema binário

Imagine, por exemplo, que se deseja representar, neste sistema numérico, o número dez mediante um conjunto de lâmpadas, onde uma lâmpada acesa representa o algarismo “ 1” e uma lâmpada apagada o algarismo “ 0”. No sistema binário, o número dez assume a forma “ 1010” (para acompanhar este raciocínio basta saber que qualquer número pode ser expresso na base dois usando apenas os algarismos “ 1” e “ 0”; portanto, mesmo que você não saiba fazer a conversão de números do sistema decimal para o binário, acredite que “dez” em binário é “ 1010” e siga adiante). Portanto, para representar o número dez bastam quatro lâmpadas uma ao lado da outra, a da esquerda acesa, sua vizinha apagada, a seguinte acesa e a última da direita apagada, na configuração “ 1010”. É claro que isto pode ser feito igualmente usando interruptores fechados e abertos, circuitos energizados e desenergizados ou capacitores carregados e descarregados (na verdade, alguns circuitos de memória usados nos computadores empregam capacitores microscópicos para armazenar valores binários).

A Figura 1 mostra a soma de dois números representada por lâmpadas (que, por sua vez, representam os dígitos binários “ 1” e “ 0” em seus estados “acesa” e “apagada”), no sistema binário e no sistema decimal.

Figura 1: Soma de dois números

Quaisquer dispositivos que podem assumir um dentre dois estados possíveis podem ser utilizados para representar quantidades expressas no sistema binário.

Computadores lidam apenas com grandezas numéricas. E qualquer valor numérico pode ser expresso em qualquer sistema numérico posicional, inclusive no sistema binário ou de base 2. Como esse sistema usa apenas dois algarismos e os dispositivos que constituem os computadores podem representar com facilidade esses dois algarismos, ele é o sistema adotado pelos computadores para o processamento de dados.

A característica mais notável deste sistema numérico é a utilização exclusiva dos algarismos “ 1” e “ 0”, os chamados “dígitos binários” para exprimir todas as quantidades e todos os valores de quaisquer variáveis usando uma combinação de um determinado número de dígitos binários, ou seja, usando apenas os algarismos “ 1” e “ 0” (é por isso que uma célula de memória precisa armazenar apenas esses dois valores).

O uso exclusivo dos algarismos “ 1” e “ 0” nos circuitos internos dos computadores pode levar a crer que eles apenas servem para resolver problemas muito específicos, cujas grandezas de entrada e saída assumam apenas dois valores e que portanto sua utilização há de ser extremamente limitada. Esta conclusão é falsa. Na verdade, toda e qualquer grandeza do mundo real, desde as cores e posições dos pontos que formam a imagem da Mona Lisa, os compassos, timbres e notas musicais que compõem a Ária da Quarta Corda, o conjunto de caracteres que consubstanciam a Divina Comédia até a sucessão ordenada de aminoácidos que formam o DNA dos seres vivos, em suma: toda e qualquer criação humana ou da natureza, seja ela qual for, pode ser codificada e representada (com maior ou menor precisão) sob a forma de um conjunto de números. E estes números podem ser expressos no sistema binário. O processo de conversão das grandezas do mundo real em quantidades expressas no sistema binário chama-se “digitalização” (por exemplo: o dispositivo denominado “escaner” nada mais é que um digitalizador de imagens, enquanto o processo de gravação de um CD de áudio é a digitalização de sons) e será discutido mais adiante.

É por isso que o computador é uma máquina tão versátil e se presta a atividades tão disparatadas como calcular, escrever, desenhar, reproduzir músicas ou vídeo.

Com um computador é possível pintar e bordar.

Inclusive literalmente...

Bits e bytes

Um dígito binário, então, é um algarismo do sistema numérico de base dois (há apenas dois: “zero” e “um”). Em inglês, “dígito binário” é “binary digit”, cuja contração produz “bit”. Um bit, portanto, nada mais é que um dígito binário, um algarismo do sistema numérico posicional de base 2. O bit é a menor unidade de dado (ou informação) que pode ser armazenada em um computador. Parece pouco, mas ainda assim essa quantidade mínima de informação tem algumas aplicações práticas (especialmente se associada a seus valores lógicos “verdadeiro” e “falso”, respectivamente). Mas, evidentemente, não se pode fazer muito processando valores de um único bit.

Na linguagem humana escrita a menor unidade de informação é uma letra, ou “caractere”. Letras isoladas, como “f” ou “S”, não podem representar muita coisa, mas a combinação de algumas delas pode significar muito, como “amor”, “vida”, “alma”.

Embora computadores sejam máquinas que trabalhem internamente apenas com grandezas numéricas, de longe sua utilização mais freqüente é trabalhar com texto (este texto foi produzido com a ajuda de um computador e provavelmente você o está lendo com a ajuda de outro). Portanto uma das primeiras preocupações dos programadores de computadores foi desenvolver um método de codificar numericamente os caracteres, ou seja, exprimi-los sob a forma de números binários (ou “digitalizá-los”) de tal forma que fosse “entendido” por todos os computadores, mesmo os de diferentes fabricantes. Em suma: um método padronizado.

Para exprimir todos os caracteres do alfabeto, precisamos usar números (binários, evidentemente) de quantos bits?

Vejamos. O alfabeto usado no idioma português tem 23 letras. O do idioma inglês, 26 (as mesmas 23 mais o “K”, o “W” e o “Y”). Como o computador diferencia maiúsculas de minúsculas, é necessário o dobro disso, 52 códigos, para exprimi-las todas. Incluindo os algarismos “ 0” a “ 9”, chegaríamos a 62 códigos. Então bastariam os números de zero a 61 para exprimir todas as letras maiúsculas, minúsculas e algarismos. Em binário, 61 é expresso por “ 111101”, um número de seis bits. Se um número de seis bits é suficiente para exprimir o maior dos códigos necessários, então é suficiente para exprimir todos os outros. Logo, bastam seis bits para exprimir todos os caracteres do alfabeto mais os dez algarismos do sistema decimal.

Mas isso não é o suficiente para trabalhar com texto. Além das letras, há os sinais gráficos como ponto, vírgula, acentos, sinais de exclamação e interrogação, etc. E caracteres acentuados (para um computador a palavra “é” não é constituída de dois caracteres, a letra “e” minúscula com um acento agudo sobre ela, mas sim de um único caractere que nada tem a ver com os dois anteriormente citados). Juntando tudo isso com alguns códigos de controle (como mudança de linha), símbolos, como @ e outros, a IBM propôs um código capaz de exprimir 128 elementos. Esse código usava sete bits mas não continha diversos caracteres acentuados e símbolos de uso corrente, que foram acrescentados posteriormente, assim como alguns usados para desenhar linhas e molduras, totalizando 256 elementos que poderiam ser expressos por números de oito bits. Essa representação foi adotada como padrão nos EUA – e posteriormente em todo o mundo – com o nome de ASCII, sigla de American Standard Code for Information Interchange, ou Código Americano Padrão para Intercâmbio de Informações, o conhecido “código ASCII”.

Devido, sobretudo, à adoção do código ASCII (além de outras razões ligadas à fabricação de microprocessadores; por exemplo: na época em que o código ASCII foi adotado, a maioria dos microprocessadores usavam posições de memórias internas – ou “registradores” – capazes de armazenar oito bits), valores expressos em binário com oito algarismos passaram a ser usados para diversas finalidades, adquirindo importância suficiente para receber designação própria. A eles foi dado o nome de byte.

Um byte é então qualquer número binário expresso com oito algarismos, ou oito bits. O maior valor que um byte pode assumir é “ 11111111” (todos os oito bits valendo “um”) que, convertido para o sistema numérico decimal, vale “ 255” (como veremos ao discutir a conversão de valores entre sistemas numéricos). O menor valor que pode ser assumido por um byte é “ 00000000” que, evidentemente, vale “zero” no sistema decimal. O número total de códigos que podem ser expressos por um byte é 256 (de zero a 255),

Note que um byte nada tem de especial, é apenas um número binário de oito algarismos. Sua importância na informática deriva apenas do fato do código ASCII haver adotado números de oito bits, além de razões meramente construtivas ou operacionais. Por exemplo: os códigos enviados a impressoras para controlar a impressão têm oito bits, os valores trocados pelos modems entre computadores também, assim como diversas outras operações elementares de intercâmbio de informações. Além disso, memórias costumam ser organizadas de tal forma que as operações de leitura e escrita são feitas com quantidades de um byte ou de um múltiplo de bytes (oito, dezesseis, trinta e dois, sessenta e quatro ou cento e vinte e oito bits – o que corresponde a um, dois, quatro, oito e dezesseis bytes, respectivamente).

Múltiplos do byte

Como memórias, tradicionalmente, são organizadas de forma que sejam lidos ou escritos um byte ou um número par de bytes em cada operação de leitura ou escrita, adotou-se como norma exprimir a capacidade de armazenamento de memórias em bytes ou em seus múltiplos.

Os múltiplos do byte mais usados para exprimir capacidade de armazenamento ou taxas de transferência de dados são quilobyte (KB), megabyte (MB), gigabyte (GB) e terabyte (TB). Em princípio, levando-se em conta o uso padronizado dos prefixos “quilo”, “mega”, “giga” e “tera” no sistema decimal, o prefixo “quilo” deveria indicar mil bytes e cada um dos demais o anterior multiplicado por mil. Infelizmente, em informática, as coisas são um pouco mais complicadas.

Os prefixos acima foram concebidos para exprimirem potências inteiras da base no sistema numérico de base dez. Assim, o prefixo “quilo” corresponde a mil vezes a unidade, ou 10 3, “mega” corresponde a um milhão, ou 10 6, “giga” a um bilhão, ou 10 9 e “tera” a um trilhão, ou 10 12.

Ora, o sistema binário usa a base 2. Ocorre que potências inteiras de dez não correspondem a potências inteiras de dois. Por exemplo: mil, expresso em binário, fica “ 1111101000”, não exatamente aquilo que podemos considerar um número “redondo” (ou, em linguagem menos popular, uma potência inteira da base). Em contrapartida, o número mais próximo a 1.000 que leva à uma potência inteira de dois é 1.024 (que corresponde a 2 10), que expresso em binário fica “ 10000000000”, tornando muito mais fácil efetuar cálculos com ele (em binário, naturalmente). Em razão disso, decidiu-se que um quilobyte, ou 1 KB, corresponde a 1.024 bytes, e não a 1.000 como seria de esperar. Pela mesma razão o prefixo “mega”, em vez de corresponder a 1.000 x 1.000, corresponde na realidade a 1.024 x 1.024 (ou 2 20), o que faz com que 1MB valha 1.048.576 bytes (e não um milhão de bytes). Fenômeno idêntico ocorre com o gigabyte (1GB = 1.073.741.824 bytes, ou 2 30) e com o terabyte (1TB = 1.099.511.627.776, ou 2 40).

Esses valores são usados na informática para exprimir, entre outras grandezas, o número de bytes transferidos entre dispositivos na unidade de tempo (taxas de transferência de dados) e capacidades de dispositivos de memória, interna (memória principal, ou memória RAM) ou externa (discos rígidos e similares).

No que toca à memória interna não há muita controvérsia e geralmente o critério acima é respeitado. Se o fabricante de um microcomputador informa que a máquina tem, digamos, 256 MB de memória principal, pode-se confiar que sua capacidade de memória seja de 256 x 1.024 x 1.024, ou 268.435.456 bytes. Mas, infelizmente, o mesmo não ocorre no que toca à memória externa, ou memória secundária, em geral constituída por discos magnéticos, ou discos rígidos. Nessa indústria, os fabricantes costumam calcular a capacidade pelos critérios acima descritos usados na informática, mas ao anunciá-la, “arredondam” para o valor mais próximo do sistema decimal. Um exemplo: digamos que a capacidade de um disco rígido seja de 37 GB calculados como o usual em informática, ou seja, de 37 x (1.024) 3 = 39.728.447.488 bytes. Essa é a capacidade real. Mas, ao anunciar o produto, o fabricante “arredonda” o valor para 40 bilhões e declara que a capacidade de seu disco rígido é de 40 GB, um número ligeiramente maior que os 37 GB reais. Uma artimanha duvidosa do ponto de vista técnico, mas altamente vantajosa do ponto de vista comercial.

Portanto, cuidado. Quando lidar com múltiplos de bytes, verifique se foram calculados usando o critério adotado correntemente na informática, ou seja, que usa para os prefixos “quilo”, “mega”, “giga” e “tera” potências inteiras da base 2 (ou múltiplos de 1024), ou se usaram o critério comercial, que adota potências de dez. Em certos casos, pode fazer diferença.

B. Piropo