REPRESENTAÇÃO DE DADOS EM SISTEMAS DE COMPUTAÇÃO AULA 03 – Arquitetura de Computadores Gil Eduardo de Andrade O conteúdo deste documento é baseado no livro “Princípios Básicos de Arquitetura e Organização de Computadores” – Linda Null e Julia Labur. Introdução Ao longo dos anos, muitos padrões e convenções foram estabelecidas para determinar certos aspectos da organização de computadores. Existem várias maneiras pelas quais computadores podem armazenar e manipular números e caracteres. A unidade de informação mais básica em um sistema digital é chamada de bit, que é uma abreviação de binary digit ou digíto binário. Um bit, de forma mais clara, nada mais é que um estado de “ligado” ou “desligado” (ou “alto” e “baixo”) dentro de um circuito de computador. Em 1964, os projetistas do computador mainframe IBM System/360 estabeleceram como convenção o uso grupos de 8 bits como a unidade básica de endereçamento de memória do computador, que foi denominada como byte. Palavras em um computador consistem de dois ou mais bytes, ou seja, possuem 16 bits, 32 bits, 64 bits ou qualquer tamanho faça sentido dentro do contexto da organização do computador. Sistemas de Numeração Posicional A ideia geral por trás de sistemas de numeração posicionais é que um valor numérico é representado por potências crescentes de uma raiz (ou base). Isto é frequentemente referido como sistema de numeração ponderado porque cada posição é ponderada pela potência de uma base. O conjunto de números válidos para um sistema de numeração posicional tem o mesmo tamanho que a base daquele sistema. Exemplificando, existem 10 dígitos no sistema decimal, que vão de 0 a 9, e dois dígitos no sistema binário, que vão de 0 a 1. O maior número válido para um sistema em uma determinada base é um a menos do que a base, ou seja, o número 8 não é um numeral válido em qualquer sistema com base menor que 9. Para distinção de números em bases diferentes, usamos a base como subscrito, tal como 3310 para representar o número decimal 33. Qualquer inteiro decimal pode ser expresso com seu valor exato em qualquer outro sistema de base inteira. Exemplo, três números representados como potência de uma base: As duas bases mais importantes na computação são a binária (base dois) e a hexadecimal (base 16). Outra base interessante é a octal (base 8). O sistema binário utiliza somente os dígitos 0 e 1; o sistema octal, utiliza os dígitos de 0 a 7. O sistema hexadecimal permite dígitos de 0 a 9, mais A, B, C, D, E e F que são usados para representar os números de 10 a 15. Conversões de Decimal para Binário Gottfried Leibniz (1646 – 1716) foi o primeiro a generalizar a ideia do sistema decimal (posicional) para outras bases. Até que os primeiros computadores digitais fossem construídos no final da década de 1940 esse sistema permaneceu nada mais do que uma curiosidade matemática. Nos dias atuais é utilizado no coração de praticamente todos os dispositivos eletrônicos que se baseiam em controles digitais. Pela sua simplicidade, o sistema de numeração binário se traduz facilmente para circuitos eletrônicos. Também é fácil de ser compreendido pelos seres humanos. Abaixo é apresentada uma tabela com alguns números e suas relativas potências. Conversão de Números Inteiros sem Sinal A conversão entre sistemas com bases diferentes pode ser feito por subtrações sucessivas ou pelo método de divisão-resto. O método com subtrações é incômodo e exige familiaridade com as potências da base sendo usada. Porém por questões de conhecimento vamos demonstrálo no exemplo abaixo: → Convertendo 10410 para base 3. Sabemos que 34 = 81 é a mais alta potência de 3 que é menor que 104, sabemos então que nosso número terá cinco dígitos (um para cada potência da base: de 0 até 4). Verificamos quantas vezes 81 cabe em 104, descobrimos que é apenas uma, então subtraímos 104 – 81 = 23. Sabemos que a próxima potência de 3, 33 = 27, é muito grande para subtrair de 23, de modo que anotamos o número 0 e vemos quantas vezes 32 cabe em 23. Vemos que é 2 (duas) e subtraímos de 18. Ficamos com 5, do qual subtraímos 31 = 3, ficamos com 2, que é 2 x 30. Estes passos são apresentados a seguir: Contudo o método de divisão-resto é mais fácil e rápido do que o método de subtrações sucessivas. Ele adota a ideia de que divisões sucessivas pela base são de fato subtrações sucessivas pela potência da base. O resto que obtemos quando dividimos consecutivamente pela base são os dígitos do resultado, que são lidos de baixo para cima. Abaixo apresentamos um exemplo deste método: → Convertendo 10410 para base 3, utilizando para tal o método de divisão-resto. Esse método funciona com qualquer base e devido à simplicidade de seus cálculos, é particularmente útil na conversão de decimal para binário. Logo abaixo temos um exemplo deste tipo de conversão: → Convertendo 14710 para binário (base 2), utilizando para tal o método de divisão-resto. Um número binário com N bits pode representar inteiros sem sinal de 0 a 2 N – 1. Por exemplo 4 bits podem representar valores decimais de 0 a 15, enquanto 8 bits podem representar valores de 0 a 255. O intervalo de valores que podem ser representados por um dado número é extremamente importante ao se fazer operações aritméticas com números binários. Considere a situação na qual números binários possuem tamanho de 4 bits e queremos somar 11112 (1510) com 11112. Sabendo que 15 + 15 = 30, porém 30 não pode ser representado usando somente 4 bits. Este é um exemplo de condição conhecida como overflow, ocorre quando o resultado de uma operação aritmética fica fora do intervalo de precisão permitido para uma dada quantidade de bits. Conversão de Frações Frações em qualquer base podem ser aproximadas em qualquer outra base usando potências negativas da raiz. Pontos da base separam a parte inteira de um número de sua parte fracionária. No sistema decimal, o ponto da base é chamado de ponto decimal. Frações binárias possuem ponto binário. Podemos converter frações entre bases diferentes usando métodos análogos aos métodos de subtrações sucessivas e divisão-resto para converter inteiros. O exemplo a seguir mostra como podemos usar subtrações sucessivas para converter um número decimal para base 5. → Convertendo 0,430410 para base 5, utilizando para tal o método de subtrações sucessivas. Como o método do resto trabalha com potências positivas da base para conversão de inteiros, é razoável usar a multiplicação para converter frações porque elas são expressas com potências negativas da base. Entretanto, em vez de procurar os restos, como feito acima, usamos somente a parte inteira do produto depois da multiplicação pela base. A resposta é lida de cima para baixo, e não de baixo para cima. O exemplo abaixo ilustra este processo. → Convertendo 0,430410 para base 5, utilizando para tal o método de divisão-resto. Representação de Inteiro com Sinal Números com sinal exigem tratamento de problemas adicionais. Quando uma variável inteira é declarada em um programa, muitas linguagens de programação automaticamente alocam uma área de memória que inclui um sinal como o primeiro bit daquela posição de memória. Os bits restantes (além do sinal) são usados para representar o próprio número. Como este número é representado depende do método usado. Entre as abordagens existentes o método de magnitude com sinal (mais intuitivo) utiliza os bits restantes para representar a magnitude do número. Este método utiliza o conceito de complementos. Magnitude com Sinal A partir deste ponto, não ignoramos mais a possibilidade de números binários negativos, sendo assim consideramos o conjunto de números inteiros positivos e negativos como conjunto denominado de inteiros com sinal. O problema de para representarmos inteiros com sinal é justamente o sinal, para isso utilizamos o método de magnitude com sinal. Como sugere o nome, um número de magnitude com sinal possui um sinal no seu bit mais à esquerda (conhecido também como bit mais significativo). Por exemplo: → Considerando uma inteiro de 8 bits: – 1 seria representado como 10000001 + 1 seria representado como 00000001 Em um sistema de computação que use a representação de magnitude com sinal e 8 bits para armazenar inteiros, 7 bits podem ser usados para representação da magnitude do número. Isto significa que o maior inteiro que pode ser representado com 8 bits é 27 – 1 = 127, já o menor inteiro que pode ser representado com 8 bits é –127. Computadores executam cálculos matemáticos com inteiros, a aritmética de magnitude com sinal é realizada usando-se essencialmente os mesmos métodos que os humanos usam com lápis e papel. Considerando as regras: (1) Se os sinais são iguais, adicione as magnitudes e use o mesmo sinal para o resultado (2) Se os sinais são diferentes, você deve determinar qual operando tem a magnitude maior. O sinal do resultado é o mesmo sinal do operando de maior magnitude, e a magnitude deve ser obtida subtraindo (e não somando) o maior do menor. Ao exemplificar esta ideia com um inteiro de 8 bits, temos que ter cuidado de incluir somente 7 bits na magnitude da resposta, descartando os carries (“vai um”) que ocorrem para o bit de mais alta ordem. Veja: → Somando 010011112 com 001000112 utilizando aritmética de magnitude com sinal temos: A aritmética segue como na adição decimal, incluindo os carries, até que seja atigindo o sétimo bit a partir da direita. Se houver um carry aqui, dizemos que temos uma condição de overflow e o carry é descartado, resultando em uma soma incorreta. Exemplo de overflow: → Somando 010011112 com 011000112 utilizando aritmética de magnitude com sinal temos: Assim como na adição a subtração em magnitude com sinal é realizada de maneira similar à lápis e papel na aritmética decimal, na qual algumas vezes é necessário pedir emprestado dígitos do minuendo. Veja os exemplos a seguir: → Subtraindo 010011112 com 011000112 utilizando aritmética de magnitude com sinal temos: → Somando 100100112 (-19) com 011000112 (+13) utilizando aritmética de magnitude com sinal temos: Obs: O primeiro número (o aditivo) é negativo porque seu bit se sinal está configurado como 1. O segundo número (o adendo) é positivo. O que devemos fazer de fato é uma subtração. Primeiro determinamos qual dos dois é maior em magnitude e usamos este número como o aditivo. Seu sinal será o sinal do resultado. → Subtraindo 100110002 (-24) com 101010112 (-43) utilizando aritmética de magnitude com sinal temos: