Baixe o app para aproveitar ainda mais
Prévia do material em texto
Professor Edino Mariano Lopes Fernandes UNIVERSIDADE DO ESTADO DE SANTA CATARINA CENTRO DE CIÊNCIAS TECNOLÓGICAS – CCT Departamento de Ciências da Computação Nota importante: Existem materiais incluídos nesta apostila de outros autores e fontes bibliográficas quase todos devidamente identificados (algumas fontes não foi possível de serem identificadas, trechos de textos, questões soltas, pinçadas aqui e ali, etc. – Caso o usuário conheça alguma fonte não identificada no texto, por favor, comunique para que se efetue os devidos créditos). Algumas questões foram retiradas de sites de Internet, sendo de uso livre. Para informações mais completas, deve-se recorrer aos livros ou Web sites citados na bibliografia fornecida na apostila da disciplina. 2 CAPÍTULO I – SISTEMAS DE NUMERAÇÃO 1.1 Introdução Um sistema de numeração é um conjunto finito de símbolos organizados através de uma lei de formação que permite representar qualquer quantidade numérica. No início dos tempos os habitantes das cavernas costumavam pintar animais nas paredes, provavelmente para armazenar informações que obtinham no seu cotidiano. Já no período historicamente conhecido os Sumérios criaram um sistema para representar sua linguagem através de desenhos, gravados em placas de argila. Mais tarde, os egípcios usavam representar sua linguagem através dos hieróglifos gravados em papiros. Os chineses gravavam mensagens nos cascos de tartarugas, os incas usavam fios com nós (os quipos). Gradativamente o homem foi aperfeiçoando sua forma de comunicação através da escrita. Os conceitos gerais de linguagem tem uma representação muito complexa - por exemplo, como representar um objeto, uma ação ou um sentimento. Presume-se que o homem encontrou mais facilidade para representar quantidades. Inicialmente, as quantidades eram representadas com os dedos. Assim, desde o princípio nosso entendimento de quantidades sempre foi digital (vem de "digitus" = dedos). O problema seguinte foi ―lembrar‖ as quantidades que foram contadas. Os mais antigos registros encontrados representam quantidades através de entalhes em ossos. Diversas civilizações antigas criaram alguma forma de representação de quantidades, mas cada número n era sempre representado por n símbolos da unidade. Para facilitar a contagem, as unidades eram agrupadas em grupos de 5 (uma mão-cheia) ou 10 (duas mãos-cheias). Os símbolos numéricos atualmente utilizados são conhecidos como Arábicos e foram desenvolvidos pelos árabes. Ao grego Pitágoras se atribui a divisão dos números em ímpares e pares. Ele concebeu que todas as manifestações da Natureza se fazem com números ou proporções matemáticas. Hoje, existem vários sistemas numéricos, dentre os quais, para este estudo, destacam- se o sistema decimal, o sistema binário, o sistema octal e o sistema hexadecimal. 1.2 Sistemas de Numeração Os sistemas de numeração têm por objetivo prover símbolos e convenções para representar quantidades, de forma a registrar a informação quantitativa e poder processá-la. A representação de quantidades se faz com os números. Na antigüidade duas formas de representar quantidades foram inventadas. Inicialmente, os egípcios, criaram um sistema em que cada dezena (uma mão-cheia de nosso exemplo anterior) era representada por um símbolo diferente. Usando por exemplo os símbolos # para representar uma centena, & para representar uma dezena e @ representando uma unidade (símbolos escolhidos ao acaso), teríamos que ###&&@ representaria 321. Sistemas de Numeração não-posicional Uma das primeiras tentativas de sistema de numeração bem sucedida é o sistema ro- mano. Ele usa um conjunto de sete símbolos {I,V,L,C,D,M} e é capaz de representar uma grande variedade de números. 3 Observe que há um conjunto finito de símbolos e uma lei de formação. Contudo ele não consegue representar qualquer quantidade como o zero por exemplo. Eram usados símbolos (letras) que representavam as quantidades, como por exemplo: I ( valendo 1), V (valendo 5), X (valendo 10), C (valendo 100), etc. A regra de posicionamento determinava que as letras que representavam quantidades menores e precediam as que representavam quantidades maiores, seriam somadas; se o inverso ocorresse, o menor valor era subtraído do maior (e não somado). Assim, a quantidade 128 era representada por: CXXVIII = 100 + 10 + 10 + 5 + 1 + 1 + 1 = 128. Por outro lado, a quantidade 94 era representada por XCIV = (-10 + 100) + (-1 + 5) = 94. Nesses sistemas, os símbolos tinham um valor intrínseco, independente da posição que ocupavam na representação (sistema numérico não-posicional). Um grande problema desse sistema é a dificuldade de realizar operações com essa representação. Assim, posteriormente foram criados sistemas em que a posição dos algarismos no número passou a alterar seu valor (sistemas de numeração posicionais). Sistemas de Numeração Posicionais Nos sistemas de numeração posicionais, o valor representado pelo algarismo no número depende da posição em que ele aparece na representação. O primeiro sistema desse tipo foi inventado pelos chineses. Eram usados palitos, sendo 1 a 5 palitos dispostos na vertical para representar os números 1 a 5; de 6 a 9 eram representados por 1 a 4 palitos na vertical, mais um palito na horizontal (valendo 5) sobre os demais. Cada número era então representado por uma pilha de palitos, sendo uma pilha de palitos para as unidades, outra para as dezenas, outra para as centenas, etc. Esse sistema, com as pilhas de palitos dispostas em um tabuleiro, permitia a realização das quatro operações aritméticas. Não existia representação para o zero (o espaço relativo ficava vazio).O tabuleiro aritmético (chamado swan-pan), além das quatro operações, era usado na álgebra e na solução de equações. Essa técnica era chamada de Método do Elemento Celestial. Porém o sistema mais bem sucedido foi o sistema decimal. Ele usa dez símbolos {0,1,2,3,4,5,6,7,8,9} e uma regra de formação capaz de representar qualquer quantidade finita. Este sistema foi originalmente inventado pelos matemáticos hindus aproximadamente em 400 D.C. Os árabes começaram a usar o sistema em 800 D.C. aproximadamente, quando ficou conhecido como o Sistema Numérico Arábico. Após ele ter sido introduzido na comunidade da Europa por volta de 1200 D.C., o sistema logo adquiriu o título de "sistema numérico decimal".(3) 1.3 Base de um Sistema de Numeração A base de um sistema é a quantidade de algarismos disponível na representação. A base 10 é hoje a mais usualmente empregada, embora não seja a única utilizada. No comércio pedimos uma dúzia de rosas ou uma grosa de parafusos (base 12) e também marcamos o tempo em minutos e segundos (base 60). Os computadores utilizam a base 2 (sistema binário) e os programadores, por facilidade, usam em geral uma base que seja uma potência de 2, tal como 24 (base 16 ou sistema hexadecimal) ou eventualmente ainda 23 (base 8 ou sistema octal). 1.4 Sistema Decimal 4 O sistema numérico ao qual estamos acostumados é o sistema numérico decimal. Este sistema foi originalmente inventado pelos matemáticos hindus aproximadamente em 400 D.C. Os árabes começaram a usar o sistema em 800 D.C. aproximadamente, quando ficou conhecido como o Sistema Numérico Arábico. Após ele ter sido introduzido na comunidade da Europa por volta de 1200 D.C., o sistema logo adquiriu o título de "sistema numérico decimal". Uma característica particular de um sistema numérico é a sua base. A base indica o número de caracteres ou dígitos usados para representar quantidades naquele sistema numérico. O sistema numérico decimal tem basedez pois são usados os dez dígitos de 0 até 9 para representar quantidades. Quando um sistema numérico é usado onde à base não é conhecida, um índice é usado para mostrar a base. Por exemplo: o número 460310 é proveniente de um sistema numérico com base dez. Notação Posicional O sistema numérico decimal é posicional ou ponderado. Isto significa que cada posição dos dígitos num número possui um peso particular o qual determina a magnitude daquele número. Cada posição tem um peso característico determinado pela potenciação da base do sistema numérico, neste caso o número dez. Os pesos posicionais são 100(unidades), 101(dezenas), 102(centenas); etc. Observe a tabela ao lado para uma lista condensada das potências de dez. Potências de 10 10 0 = 1 105 = 100.000 10 1 = 10 106 = 1.000.000 10 2 = 100 107 = 10.000.000 10 3 = 1.000 108 = 100.000.000 10 4 = 10.000 109 = 1.000.000.000 Nós determinamos o valor total de um número considerando os dígitos específicos e os pesos de suas posições. Por exemplo, o número decimal 4603 está escrito na notação habitual. Este número também pode ser escrito na notação posicional. Para determinar o valor de um número devemos multiplicar cada dígito pelo peso de sua posição e somar os resultados. Notação Posicional de um Número 4603 na Base 10 ( 4 x 10 3 ) + ( 6 x 102) + ( 0 x 101) + ( 3 x 100 ) ( 4 x 1000 ) + ( 6 x 100 ) + ( 0 x 10 ) + ( 3 x 1 ) Abaixo ilustra-se a representação de um número no sistema decimal e na forma equivalente, de notação posicional, a cada dígito (símbolo) do número decimal é atribuído um certo peso em função da sua posição no número. O número 10 é definido como a base deste sistema. 5 (Forma Posicional) 3475 = 3000 + 400 + 70 + 5 (Forma Polinomial) = 3 x 103 + 4 x 102 + 7 x 101 + 5 x 100 onde, 10 é a base do sistema, e 103 , 102 ,101 e 100 representam os pesos. Outro exemplo: 123,456 = 100 + 20 + 3 + 0,4 + 0,005 + 0,0006 = 1 x 102 + 2 x 101 + 3 x 100 + 4 x 10-1 + 5 x 10-2 + 6 x 10-3 O princípio da atribuição de pesos, observado na notação posicional, pode ser estendido a qualquer sistema numérico.Na base 10, dispõe-se de 10 algarismos para a representação do número: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. Na base 2, seriam apenas 2 algarismos: 0 e 1. Na base 16, seriam 16: os 10 algarismos aos quais estamos acostumados, mais os símbolos A, B, C, D, E e F, representando respectivamente 10, 11, 12, 13, 14 e 15 unidades. Generalizando, temos que uma base b qualquer disporá de b algarismos, variando entre 0 e (b-1). Números Fracionários Até agora, apenas números inteiros ou números completos foram discutidos. Um inteiro é qualquer um dos números naturais, os negativos destes números, ou zero (ou seja, 0, 1, 4, 7, etc...). Assim, um inteiro representa um número completo. Mas, é geralmente necessário expressar quantidades em termos de partes fracionárias de um número completo. Frações decimais são números cujas posições tem pesos que são potências negativas de dez tais como: 10 -1 = 1/10 = 0,1; 10 -2 = 1/100 = 0,01, etc... A tabela fornece uma lista condensada das potências negativas de dez (frações decimais). Potências Negativas de 10 10-1 = 0,1 10-5 = 0,00001 10-2 = 0,01 10-6 = 0,000001 10-3 = 0,001 10-8 = 0,0000001 10-4 = 0,0001 10-9 = 0,00000001 Um ponto base (ponto decimal para números na base dez) separa a parte inteira da parte fracionária de um número. A parte inteira fica à esquerda do ponto decimal e tem os pesos posicionais de unidades, dezenas, centenas, etc. A parte fracionária do número fica à direita do ponto decimal e tem os pesos posicionais de décimos, centésimos, milésimos, etc. Para exemplificar, o número decimal 278,94 pode ser escrito com notação posicional como mostrado abaixo. Notação Posicional de um Número 278,94 na Base 10 ( 2 x 10 2 ) + ( 7 x 101) + ( 8 x 100) + ( 9 x 10-1 ) ( 4 x 10-2 ) ( 2 x 100 ) + ( 7 x 10 ) + ( 8 x 1 ) + ( 9 x 1/10 ) ( 4 x 1/100 ) 200 + 70 + 8 + 0.9 = 0.04 = 278,9410 6 Neste exemplo, o dígito mais a esquerda (2x102) é o dígito mais significativo ou MSD ("most significant digit") pois, ele tem o maior peso na determinação do valor do número. O dígito mais a direita, chamado o dígito menos significativo ou LSD ("least significant digit") tem o menor peso na determinação do valor do número. Portanto, conforme o nome diz, o MSD é o dígito que provocará a maior variação quando seu valor for alterado. O LSD tem o menor efeito no valor total do número. A representação 125,3810 (base 10) significa 1x10 2 + 2x101 + 5x100 + 3x10-1 + 8x10-2 : Ou seja, , podemos representar uma quantidade N qualquer, numa dada base b, com um número tal como segue: Nb = an.b n + .... + a2.b 2 + a1.b 1 + a0.b 0 + a-1.b -1 + a-2.b -2 + .... + a-n.b -n , sendo que, an.b n + .... + a2.b 2 + a1.b 1 + a0.b 0 é a parte inteira e a-1.b -1 + a-2.b -2 + .... + a-n.b -n é a parte fracionária. Intuitivamente, sabemos que o maior número que podemos representar, com n algarismos, na base b, será o número composto n vezes pelo maior algarismo disponível naquela base (ou seja, b-1). Por exemplo, o maior número que pode ser representado na base 10 usando 3 algarismos será 999 (ou seja, 103 - 1 = 999). Podemos ver que o maior número inteiro N que pode ser representado, em uma dada base b, com n algarismos (n "casas"), será N = bn - 1. Assim, o maior número de 2 algarismos na base 16 será FF16 que, na base 10, eqüivale a 25510 = 16 2 - 1. 1.5 Base diferente de 10 A regra de formação de nosso sistema de numeração não está, de forma alguma, atada ao número de símbolos usados. Assim, podemos pensar em sistemas de numeração com qualquer quantidade de símbolos ou qualquer base. Imagine que temos, apenas, três símbolos {0,1,2}. Neste caso os números seriam re- presentados da seguinte forma: Na base 10 Na base 3 0 0 1 1 2 2 3 10 4 11 5 12 6 20 7 21 8 22 9 100 10 101 11 102 12 110 Se, em vez dos símbolos 0, 1 e 2, tivéssemos os símbolos {, , } isto, em nada, mudaria as coisas. Pois os numerais seriam: Na base 10 Na base 3 Na base 3 com , e 0 0 1 1 7 2 2 3 10 4 11 5 12 6 20 Algumas bases particularmente importantes para nós são as bases 2, 8 e 16 ditas binária, octal e hexadecimal respectivamente. 1.6 Sistema Binário Criado por um matemático alemão do século dezessete, Golttfried Wilhelm von Leibniz foi o advogado do sistema binário de numeração que tem por base o número 2, usando apenas os símbolos 0 e 1. As razões que o levaram a este sistema parece ter sido mística onde havia grande beleza na analogia entre zero representando o vazio e um representado a divindade. Os computadores modernos utilizam apenas o sistema binário, isto é, todas as informações armazenadas ou processadas no computador usam apenas DUAS grandezas, representadas pelos algarismos 0 e 1. Essa decisão de projeto deve-se à maior facilidade de representação interna no computador, que é obtida através de dois diferentes níveis de tensão. Havendo apenas dois algarismos, portanto dígitos binários, o elemento mínimo de informação nos computadores foi apelidado de bit (uma contração do inglês binary digit). Representação Binária Potência Repr.Decimal 1 20 1 1 0 21 2 1 0 0 22 4 1 0 0 0 23 8 1 0 0 0 0 24 16 1 00 0 0 0 25 32 1 0 0 0 0 0 0 26 64 1 0 0 0 0 0 0 0 27 128 1 0 0 0 0 0 0 0 0 28 256 1 0 0 0 0 0 0 0 0 0 29 512 1 0 0 0 0 0 0 0 0 0 0 210 1.024 A representação binária é perfeitamente adequada para utilização pelos computadores. No entanto, um número representado em binário apresenta muitos bits, ficando longo e passível de erros quando manipulado por seres humanos normais como por exemplo os programadores, analistas e engenheiros de sistemas (bem, não tão normais assim ...). Para facilitar a visualização e manipulação por programadores de grandezas processadas em computadores, são usualmente adotadas as representações octal (base 8) e principalmente hexadecimal (base 16). Ressaltamos mais uma vez que o computador opera apenas na base 2 e as representações octal e hexadecimal não são usadas no computador, elas se destinam apenas à manipulação de grandezas pelos programadores. 8 A seguir apresentam-se números representados no sistema binário e na notação posicional. 10012 1011011.10012 No sistema binário, o ponto (.) é equivalente à vírgula do sistema decimal. Formatos binários Assim como nos números decimais, os zeros colocados à esquerda de dígitos binários não são significativos. Podemos colocar infinitos zeros à esquerda de um número binário e, nem assim, seu valor se modifica. Veja o número binário 101, que corresponde a 5 decimal: 101 = 0000 0101 = ...00000000000000000000101 Na matemática pura, qualquer valor pode ter um número infinito de dígitos (lembrando que os zeros colocados à esquerda não alteram o valor do número). Com os computadores a coisa é um pouco diferente, pois trabalham com um número específico de bits(derivado de binary digit). Os grupos de dígitos binários mais comumente utilizados pelos computadores são: bits únicos, grupos de 4 bits - chamados de nibble, grupos de 8 - chamados de byte, grupos de 16 - chamados de word (word = palavra), etc. A razão da existência destes grupos é funcional, característica dos chips 80x86. Vamos convencionar que oito bits agrupados são chamados de 1 byte , e um bit representa um dígito binário e adotar a convenção de grafá-los sempre em múltiplos de quatro casas. Por exemplo, o decimal 5 poderá ser grafado como 0101, 00000101, 000000000101 ou mesmo 0000000000000101. No sistema decimal costumamos separar os dígitos em grupos de três: 1.748.345 é mais legível que 1748345. No sistema binário agruparemos os dígitos em grupos de quatro, que chamaremos nibble, também para melhorar a legibilidade. Por exemplo, 0000000000000101 será grafado 0000 0000 0000 0101. Um único bit consegue representar unicamente dois valores diferentes (tipicamente zero ou um). O que precisa ficar claro é a dualidade do bit. Esta dualidade pode se referir a itens de um mesmo tipo ou a itens de natureza completamente diferente. Um bit pode representar 0 ou 1, verdadeiro ou falso, ligado ou desligado, masculino ou feminino, certo ou errado. Um bit também pode representar quaisquer dois valores (como 589 ou 1325) ou duas cores (como azul ou vermelho). Nada impede de que um bit represente dois itens de natureza distinta, como 589 ou vermelho. Podemos representar qualquer par de itens com um bit, mas apenas um único par de itens. A coisa pode ficar ainda mais complexa quando bits diferentes representarem itens diferentes. Por exemplo, um bit pode representar os valores 0 ou 1, enquanto outro bit adjacente pode representar os valores falso ou verdadeiro. Olhando apenas para os bits, não é possível reconhecer a natureza do que estejam representando. Isto mostra a idéia que está por trás das estruturas de dados num computador: dados são o que você definiu. Se você usar um bit para representar um valor booleano (falso/verdadeiro), então este bit, de acordo com a definição que você deu, representa falso ou verdadeiro. Para que o bit tenha significado, é preciso manter a consistência: se você estiver usando um bit para representar falso ou verdadeiro, este bit, em todos os pontos do seu programa, deve apenas conter a informação falso ou verdadeiro; não pode ser usado para representar cores, valores, ou qualquer outro tipo de item. 9 Como a maioria dos itens que precisam ser representados possuem mais do que dois valores, bits únicos não são o tipo de dado mais usado. Conjuntos de bits são os tipos mais utilizados em programas e valem uma análise mais detalhada. O nibble Um nibble é um conjunto de quatro bits. Não seria um tipo de dado muito interessante não fosse a existência de dois itens especiais: números BCD (binary coded decimal) e números hexadecimais. Um dígito BCD ou um dígito hexadecimal precisa exatamente de quatro bits para ser representado. Com um nibble podemos representar até 16 valores distintos. No caso dos números hexadecimais, cada um dos valores 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F é representado por quatro bits. Quaisquer 16 valores distintos podem ser representados por um nibble, mas os mais importantes e conhecidos são os dígitos BCD e hexadecimais. O byte Sem dúvida alguma, a estrutura de dados mais importante usada pelos microprocessadores 80x86 é o byte. Um byte é um conjunto de oito bits, o menor item de dado endereçável no 80x86. Isto significa que o menor item que pode ser acessado individualmente por um programa 80x86 é um valor de oito bits. Para acessar qualquer coisa menor, é preciso ler o byte que contenha os dados e usar uma máscara para filtrar os bits desejados. Os bits de um byte também são numerados da direita para a esquerda, de 0 a 7. O bit 0 é o bit de ordem baixa (LSB – Less Significant Bit)) ou bit menos significativo e o bit 7 é o bit de ordem alta (MSB – Most Significant Bit)) ou bit mais significativo. Os outros bits são referenciados pelos seus números. Observe que um byte possui dois nibbles. O nibble com os bits de 0 a 3 é o nibble LSB e o nibble com os bits de 4 a 7 é o nibble MSB. Como o byte possui dois nibbles e cada nibble corresponde a um dígito hexadecimal, valores byte são expressos através de dois dígitos hexadecimais. Como um byte possui 8 bits, ele pode representar 28 = 256 valores diferentes. Geralmente um byte é utilizado para representar valores numéricos positivos de 0 a 255, valores numéricos com sinal de -128 a 127, os códigos dos caracteres ASCII e outros tipos especiais de dados não necessitem de mais do que 256 valores diferentes. Muitos tipos de dados possuem menos do que 256 itens, de modo que oito bits são suficientes para representá-los. Uma vez que o 80x86 é uma máquina de bytes endereçáveis, é mais eficiente manipular um byte completo do que um bit individual ou um nibble. Por esta razão, a maioria dos programadores usam o byte completo para representar tipos de dados, mesmo quando possuam menos do que 256 itens. Por exemplo, é comum representar os valores booleanos falso e verdadeiro com 0000 0000 e 0000 0001. 10 O uso mais importante do byte é, provavelmente, para representar um código de caracter. Todos os caracteres digitados no teclado, mostrados na tela ou impressos numa impressora, possuem um valor numérico. Para padronizar estes valores, criou-se o conjunto de caracteres ASCII. O conjunto ASCII básico possui 128 códigos. Os 128 restantes são utilizados com valores para caracteres adicionais como caracteres europeus, símbolos gráficos, letras gregas e símbolos matemáticos. Pesquise sobre a tabela ASCII de caracteres/códigos. O word O word (palavra) é um grupo de 16 bits, numerados da direita para a esquerda de 0 a 15. O bit 0 é o LSB e o bit 15 o MSB. Os restantes são referenciados pelos seus números. Observe que o word é composto por dois bytes. O byte com os bits de 0 a 7 é o bytemenos significativo ou de ordem baixa (O.B.) e o byte com os bits de 8 a 15 é o byte mais significativo ou de ordem alta (O.A.) É claro que um word também pode ser dividido em quatro nibbles. O nibble menos significativo no word, de O.B., é o nibble 0 e o nibble mais significativo no word, de O.A., é o nibble 3. Com 16 bits é possível obter 216 = 65.536 valores diferentes. Estes podem ser valores numéricos positivos de 0 a 65.535, numéricos com sinal de -32.768 a 32.767 ou qualquer outro tipo de dado que possua até 65.536 valores. Words são usados principalmente para três tipos de dados: valores inteiros, deslocamentos (offsets) e valores de segmento. Words podem representar valores inteiros de 0 a 65.535 ou de -32.768 a 32.767. Valores numéricos sem sinal são representados pelo valor binário que corresponde aos bits no word. Valores numéricos com sinal usam a forma de complemento de dois. Valores de segmento, que sempre têm comprimento de 16 bits, constituem o endereço de memória de parágrafos do código, de dados, do segmento extra ou do segmento da pilha. Armazenar ! 11 O double word O double word (palavra dupla) é o que o nome indica: um par de words. Portanto, um double word é um conjunto de 32 bits. Naturalmente, um double word pode ser quebrado em 2 words, 4 bytes ou 8 nibbles. Double words podem representar todo tipo de coisa. Em primeiro lugar estão os endereços segmentados. Outro item comumente representado por um double word são os valores inteiros de 32 bits, que podem ir de 0 a 4.294.967.295, ou números com sinal, que podem ir de -2.147.483.648 a 2.147.483.647. Valores de ponto flutuante de 32 bits também cabem num double word. Na maioria das vezes, os double words são usados para armazenarem endereços segmentados. 1.7 Sistema Octal e Sistema Hexadecimal Em projetos de Tecnologias da Informação (isto é, nos trabalhos realizados pelos programadores, analistas e engenheiros de sistemas), é usual representar quantidades usando sistemas em potências do binário para reduzir o número de algarismos da representação e consequentemente facilitar a compreensão da grandeza e evitar erros. No sistema octal (base 8), cada três bits são representados por apenas um algarismo octal (de 0 a 7). No sistema hexadecimal (base 16), cada quatro bits são representados por apenas um algarismo hexadecimal (de 0 a F). Neste sistema, usam-se os dígitos 0,1,2,3,4,5,6,7,8,9 e as letras A, B, C, D, E e F, que correspondem aos algarismos decimais 10,11,12,13,14 e 15, respectivamente. A seguir, apresentamos uma tabela com os números em decimal e sua representação correspondente em binário, octal e hexadecimal: 12 Base 10 Base 2 Base 8 Base 16 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F Nota: a base 16 ou sistema hexadecimal pode ser indicada também por um "H" ou "h" após o número; por exemplo: FFH significa que o número FF (ou 255 em decimal) está em hexadecimal. Não confundir o "H" ou "h" com mais um dígito, mesmo porque em hexadecimal só temos algarismos até "F" e portanto não existe um algarismo "H". Exemplo: Como seria a representação do número 1610 em binário, octal e hexadecimal? Solução: Seria respectivamente 100002, 208 e 1016. Exemplos: 7268 54,378 145H 5A3 EF4 1.8 Conversões de Bases Mudança de Base de Números Inteiros Base, como já foi dito, é número de símbolos usados em um sistema de numeração posicional. Para todos os efeitos, a base determina unicamente o sistema de numeração posicional. Não importa se usa-se 0, 1 e 2 ou , e , ambos formam um sistema de numeração posicional de base três. Assim, mudar de base é representar um número dado em um sistema de numeração posicional em um outro sistema de numeração posicional com uma base diferente. Como, na maioria das vezes usamos os mesmos algarismos para as diversas bases, fica difícil decidir, só por olhar, em que base está representado um determinado número. Para contornar este problema, convenciona-se indicar em subescrito o valor da base. Assim, o número dezessete em diversas bases seria: 1710, 178 ou 1716 etc. 13 Da base 10 para uma base b Para transformar um número decimal inteiro em um número em uma base b qualquer basta fazer divisões inteiras sucessivas do número por b e, depois, reunir os restos em ordem inversa. Por exemplo, qual será a representação de 1310 na base 2? Executando divisões sucessivas até encontrar quociente 0, obtemos: 13 2 = 6 r = 1 6 2 = 3 r = 0 3 2 = 1 r = 1 1 2 = 0 r = 1 Assim, tomando os restos das divisões em ordem contrária a que eles aparecem concluímos que: 1310 = 11012 De uma base b para a base 10 Para transformar um número representado em um base b na base 10 basta expandir o polinômio que representado por este número. Assim, se temos o número Nb = b , onde , e são algarismos da base b, basta expandir e calcular o polinômio para determinar N10. N10 = b 2 + b1 + b0 Por exemplo, qual o valor de N2 = 11012 na base 10? Para tanto, basta calcular: N10 = 1 2 3 + 1 22 + 0 21 + 1 20 N10 = 8 + 4 + 0 + 1 N10 = 13 De uma base “a” para uma base “b” Para fazer a mudança de uma base ―a‖ para uma base ―b‖ basta passar da base ―a‖ para a base 10 e depois passar da base 10 para a base ―b‖. Coisas que já sabemos fazer. Por exemplo, 314 correspondo ao que na base 6? Primeiro, passamos 314 para a base 10: N10 = 3 4 1 1 40 = 12 + 1 = 1310 Depois, passamos o 1310 para a base 6: 13 6 = 2 r = 1 2 6 = 0 r = 2 o que dá o número 216. Portanto, concluímos que 314 é igual a 216. 14 De base 10 para base 2. Exemplo 1 : Converter o número 40010 para binário. De base 2 para base 10. 1001101 = 1 x 26 + 0 x 25 + 0 x 24 + 1 x 23 + 1 x 22 + 0 x 21 + 1 x 20 = 64 + 0 + 0 + 8 + 4 + 0 + 1 = 7710 De base 2 para base 8. Para transformar um número binário em octal, basta separá-lo em grupos de três algarismos a partir da direita, por exemplo: Tomemos o número binário 110010. Separando, 110 010 Faz-se então a conversão para o sistema decimal. Como o maior número que se pode formar com três algarismos é 7, a conversão irá resultar diretamente no número no sistema octal. 1102 = 68 0102 = 28 Portanto, 1100102 = 628 De base 8 para base 2. Desmembra-se o número e transforma-se cada algarismo no correspondente binário. 278 2 = 010 e 7 = 111, portanto 278 = 0101112 15 De base 2 para base 16. É análogo à conversão do sistema binário para octal, sendo que nesse caso, agrupamos de 4 em 4 algarismos da direita para a esquerda. Exemplo: Converter o binário 10011000 em hexadecimal. 1001 = 9 1000 = 8 Portanto 100110002 = 98H De base 16 para base 2. É análogo à conversão do sistema octal para binário, sendo que nesse caso, necessitamos de 4 algarismos binários para representar o número hexadecimal. Exemplo: Converter o número C13 em binário. C = 1100 1 = 0001 3 = 0011 Portanto, C13H = 1100000100112 De base10 para base 8. Exemplo: Converter 12510 para base 8. O mesmo raciocínio vale para conversão da base 10 para uma base r , menor que 10. De base 8 para base 10 Exemplo: Converter 1748 para decimal. 1748 = 1 x 8 2 + 7 x 81 + 4 x 80 = 64 + 56 + 4 = 12410 16 De base 10 para base 16 De base 16 para base 10 1C3 = 1 x 162 + C x 161 + 3 x 160 = 1 x 162 + 12 x 161 + 3 x 160 = 45110 De base 16 para base 8 Para fazer transformações entre as bases 8 e 16, que não são potências uma da outra, usamos a base 2 como intermediária nestas transformações. Por exemplo, para transformar 1BC416 na base 8, primeiro transformamo-lo para a base 2. Então: 1BC416 = 0001.1011.1100.01002 reagrupando o agora número binário de três em três temos: 0.001.101.111.000.1002 = 157048 Portanto, 1BC416 = 157048. De base 8 para base 16 Por outro lado, se tivermos, por exemplo, o número 2358 para transformá-lo para a base 16, primeiro passamo-lo para a base 2. 2358 = 010.011.1012 Em seguida grupamos os algarismos binários de quatro em quatro. 0.1001.11012 = 9D16 Portanto 2358 = 9D16. 1.9 Conversão de números fracionários Não são apenas os números inteiros que têm representação em outras bases. Os números com parte fracionária também podem ser mudados de base. As regras para estas mudanças são muito semelhantes as dos números inteiros. A principal diferença é que os números inteiros têm potências positivas enquanto os fracionários têm potências negativas. 17 1.9.1 Da base 10 para uma base b Para passar um número fracionário da base 10 para uma base b, basta multiplicá-lo sucessivamente pela base de destino, guardando a parte inteira, até alcançar zero. Por exemplo, qual a representação de 0,12510 na base 2? Para determinar isto, multiplicamos sucessivamente 0,125 por 2: 0,125 2 = 0,25 i = 0 0,25 2 = 0,5 i = 0 0,5 2 = 1 i = 1 Assim, concluímos que 0,12510 é igual a 0,0012. Algumas vezes, não é possível alcançar o fim da parte fracionária porque a represen- tação na base de destino tem uma quantidade muito grande de dígitos decimais. Neste caso, paramos o processo em algum ponto e assumimos um erro de aproximação. Por exemplo, qual o valor de 0,3710 na base 2? Como antes fazemos as multiplicações sucessivas: 0,37 2 = 0,74 I = 0 0,74 2 = 1,48 I = 1 0,48 2 = 0,96 I = 0 0,96 2 = 1,92 I = 1 0,92 2 = 1,84 I = 1 0,84 2 = 1,68 I = 1 ... Com isto vemos que 0,3710 corresponde aproximadamente a 0,0101112, 1.9.2 De uma base b para a base 10 Da mesma forma que nos números inteiros, para se passar de uma base b para a base 10, bastar expandir e calcular o polinômio representado pelo número em questão. Por exemplo, para encontrar o valor na base 10 do número 0,0101112 expande-se o polinômio: 0 2 1 2 0 2 1 2 1 2 1 2 0 1 2 1 1 2 0 1 2 1 1 2 1 1 2 1 1 2 1 4 1 16 1 32 1 64 16 4 2 1 64 23 64 0 359375 1 2 3 4 5 6 1 2 3 4 5 6 , que da um resultado aproximado de 0,35937510. Como você pode notar acima, o numero 0,0101112 é a representação aproximada de 0,3710. Agora que sabemos o valor exato da representação de 0,0101112 podemos de- terminar o erro que cometemos ao parar de fazer as multiplicações. Este erro é de 0,3710 - 0,35937510 = 0,01062510 ou 2,87%. Quanto mais casas decimais colocássemos, menor seria o erro relativo. 18 1.9.3 De uma base “a” para uma base “b” Para trocar de uma base ―a‖ para uma base ―b‖ qualquer, o processo é exatamente igual ao dos números inteiros. Isto é, passa-se da base ―a‖ para a base 10 e, em seguida, da base 10 para a base ―b‖. 1.10 Mudança de Base de Números Mistos A mudança de base dos números mistos é feita tratando-se a parte inteira e a parte fracionária separadamente. Transforma-se uma, depois outra e, finalmente, juntam-se as partes. Por exemplo, para transformar 12,062510 para a base 2, primeiro transformamos a parte inteira: 12 2 = 6 r = 0 6 2 = 3 r = 0 3 2 = 1 r = 1 1 2 = 0 r = 1 De onde se conclui que a parte inteira 1210 é igual a 11002. Em seguida, transformamos a parte fracionária: 0,0625 2 = 0,125 i = 0 0,125 2 = 0,25 i = 0 0,25 2 = 0,5 i = 0 0,5 2 = 1 i = 1 Com isto, vemos que a parte fracionária fica 0,062510 igual a 0,00012. Portanto, o número completo transformado é: 12,062510 = 1100,00012 Exemplos: Converter 101.1012 para base 10. 101.1012 = 1 x 2 2 + 0 x 21 + 1 x 20 + 1 x 2-1 + 0 x 2-2 + 1 x 2-3 = 5,62510 Converter 8,37510 para a base 2. Neste caso, transformamos primeiramente a parte inteira do número: 8 = 1000 Então, a seguir, utilizamos a seguinte seqüência: 0,375 x 2 = 0, 750 o primeiro algarismo após a vírgula é o primeiro dígito do binário 0,750 x 2 = 1,500 o primeiro algarismo após a vírgula é o segundo dígito do binário, sendo 1, e a parte do número após a vírgula não for nula, separamos o que fica depois da vírgula e reiniciamos 0,500 x 2 = 1,000 neste caso, a parte depois da vírgula é nula, o processo termina, e o binário fica sendo: 8,37510 = 1000.011 19 Pode-se também utilizar o seguinte método: some todos os pesos das posições no número onde os l's binários aparecem. Os pesos das posições inteiras e fracionárias são indicadas a seguir. INTEIRAS FRACIONÁRIAS 27 26 25 24 23 22 21 20 ponto binário . 2-1 2-2 2-3 128 64 32 16 8 4 2 1 .5 .25 .125 Exemplo 1: Converter o número binário 1010 no seu equivalente decimal. Desde que nenhum ponto binário é mostrado, o número é suposto ser um número inteiro, onde o ponto binário está à direita do número. O "bit" mais a direita, chamado o bit menos significativo ou (LSB) tem o menor peso inteiro de 20 = 1. O "bit" mais a esquerda é o bit mais significativo ou (MSB) pois ele comporta o maior peso na determinação do valor do número neste caso, ele tem um peso de 23 = 8. Para avaliar o número, some os pesos das posições onde os l's binários aparecem. Neste exemplo, l's aparecem nas posições 23 e 21. O equivalente decimal é dez. Notação Posicional Número binário 1 0 1 0 Pesos posicionais 23 22 21 20 Equivalente decimal 8+ 0+ 2+ 0= 1010 Exemplo 2: Para ressaltar este processo, converter o número binário 101101.112 no seu equivalente decimal: Notação Posicional Número binário 1 0 1 1 0 1 . 1 1 Pesos posicionais 25 24 23 22 21 20 . 2-1 2-2 Equivalente decimal 32+ 0+ 8+ 4+ 0+ 1 . 0,5+ 0,25= 45,7510 1.11 Operações aritméticas no sistema binário 1.11.1 Adição A adição binária é realizada como a adição decimal. Se dois números decimais 56719 e 31863, são adicionados, a soma 88582 é obtida. Você pode analisar os detalhes desta operação da seguinte maneira. 20 A adição no sistema binário é realizada como numa adição convencional no sistema decimal. 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 1 + 1 + 1 = 11 Como no sistema decimal, 1 + 1 = 2, no sistema binário representamos o 2 por 10, o 3 por 11, e assim por diante. Na soma, portanto, usamos o transporte, como fazemos no sistema decimal quando a soma passa de 9. 1.11.2. Subtração O método é análogo ao do sistema decimal.0 – 0 = 0 1 – 0 = 1 1 – 1 = 0 0 – 1 = 1 e empresta 1 Exemplo: 1000 – 111 -1-1-1 1000 - 111 0001 Por exemplo: Somando a primeira coluna, números decimais 9 e 3, resulta o dígito 2 com um transporte de 1. O transporte é então somado à próxima coluna. Adicionado à segunda coluna, (1+1+6), resulta o número 8, sem transporte. Este processo continua até que todas a colunas (incluindo os transportes) tenham sido somadas. A soma representa o valor numérico das parcelas. 21 1.11.3. Multiplicação Procede-se como na multiplicação decimal. 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Exemplo: 11010 x 10 1.11.4. Divisão A divisão binária, por sua vez, utiliza processo análogo ao sistema decimal, como mostra o exemplo: Seja efetuar a operação: 101100 : 100 1.12 Números negativos no sistema binário I Métodos possíveis: Sinal-módulo (bit de sinal); (método mais simples) Complemento de 2; (método utilizado computacionalmente) a) Método Sinal-módulo Usualmente, reserva-se um bit (colocado à esquerda do número, na posição do algarismo mais significativo). Se o número for positivo, o bit de sinal será 0, se for negativo, será 1. Exemplos: 3510 = 1000112 +3510 = +1000112 01000112 -3510 = -1000112 11000112 22 7310 = 10010012 +7310 = +10010012 010010012 -7310 = - 10010012 110010012 Bit de sinal 0: número positivo; 1: número negativo; b) Método do complemento de 2 O método usado para representar números com sinal em microprocessadores é chamado complemento de dois. Números positivos são representados exatamente como eram com o método do sinal e magnitude e o método do complemento de um. Entretanto, números negativos são representados como complemento de dois dos números positivos. O complemento de dois de um número é formado tomando-se o complemento de um e somado-se um. Por exemplo se você trabalha com números de 8 bits e usa o sistema de complemento de dois, +410 é representado por 000001002. Para achar -410 você deve achar o complemento de dois deste número. Você faz o complemento de um, o que é 111110112 e soma 1. Assim a representação em complemento de dois de -410 é 111111002. Faz uso de dois passos distintos: a) Obtenção do complemento de 1 (inversor) A obtenção do complemento de 1 dá-se pela troca de cada bit do número pelo seu inverso ou complemento. Exemplo: 100110112 011001002 (*) (*) O número de bits precisa ser fixo (no caso 8) a) Obtenção do complemento de 2 23 c) Complemento de 2 na aritmética binária Na eletrônica digital de dispositivos tais como computadores, circuitos simples custam menos e operam mais rápido do que circuitos mais complexos. Logo números em complementos de dois são usados na aritmética pois eles permitem os circuitos mais simples, baratos e rápidos. Os computadores não conseguem realizar as subtrações do mesmo modo que o ser humano, eles apenas somam. O somador na ALU (Unidade Lógica e Aritmética) sempre soma padrões de bits como se eles fossem números binários sem sinal. É a nossa interpretação destes padrões que decide se números com ou sem sinal estão sendo indicados. Isto nos permite trabalhar como números com e sem sinal sem requerer diferentes circuitos para cada padrão. A aritmética de complemento de dois também simplifica a ALU em outro ponto. Todo o microprocessador tem uma instrução de subtração. Assim, a ALU deve ser capacitada a subtrair um número de outro. Entretanto, se isto necessitar de um circuito de subtração separado, a complexidade e o custo da ALU seria aumentado. Felizmente, a aritmética de complemento de dois permite a ALU, realizar operações de subtração usando um circuito somador. Ou seja, a CPU usa o mesmo circuito tanto para soma como para subtração. Assim, para fazermos uma subtração usando complemento de 2: Caso 1: A > B A: 1011 (decimal 11) 1011 B: 0110 (decimal 6) -> compl.de 2 -> 1010 Caso 2: A < B A: 0110 (decimal 6) 0110 B: 1011 (decimal 11) -> compl. de 2 -> 0101 24 1.13 Código BCD A sigla BCD representa as iniciais de ‗Binary-Coded-Decimal‖, que significa uma codificação do sistema decimal em binário. A formação deste código, já conhecida é: Decimal BCD 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 O número de ―bits‖ (binary digit) de um código é o número de dígitos binários que ele possui. Notamos, então, que o código BCD é um código de 4 bits. LSB Least Significant Bit MSB Most Significant Bit 25 1.14 Representação de Dados Um programa (a seqüência de instruções) deverá manipular diferentes tipos de dados. Os dados podem ser: Numéricos Ponto fixo (números inteiros) Ponto flutuante (números reais ou fracionários) BCD (representação decimal codificada em binário) Alfabéticos Letras, números e símbolos (codificados em ASCII e EBCDIC) O tipo de dado que está sendo fornecido ao programa deverá ser informado pelo programador, através de declarações, fazendo com que o programa interprete o dado fornecido de acordo com a declaração. Por exemplo, na linguagem C, declarações tipo int num; (inteiro) ou float sal (real); indicam que a variável num é um número inteiro (int) e a variável sal é um número real (float), representação científica, isto é, representado na forma [(Sinal) Valor x Base (elevada a Expoente)]. Declarações tipo char letra; indicam que a variável é um caractere. A forma mais intuitiva de representar números seria através da conversão do número decimal para seu correspondente em binário. Como os computadores operam sempre em binário, essa seria a forma mais imediata e eficiente. No entanto, quando queremos representar números muito grandes, essa forma se torna insuficiente. A faixa de números que podem ser representados em ponto fixo é insuficiente para a maioria das aplicações científicas, onde existe a necessidade de representar-se números muito grandes e/ou números muito pequenos. Para contornar este problema, desenvolveu-se a notação científica, onde um quintilhão é representado por 1,0 x 1018, em vez de escrevê-lo por extenso (1 000 000 000 000 000 000). A representação de números em ponto flutuante é basicamente a versão binária da notação científica. Um número em ponto flutuante, representado em binário, deve fornecer as informações relativas à mantissa (seu sinal e sua magnitude) e ao expoente (também seu sinal e sua magnitude). Diversas representações podem ser utilizadas para isto (sinal/magnitude, complemento de dois, etc). Devido a isto, existem diversos formatos adotados para representar os números em ponto flutuante. Muitos deles são específicos para uma determinada família de computadores ou para um determinado fabricante. Assim, um número em notação científica pode ser representado por um produto de dois fatores: o primeiro fator indica o sinal do múmero mais a sua parte significativa, sua 26 precisão, e a segunda parte indica a grandeza do número, representada por uma potência; é justamente o valor do expoente quemarca essa grandeza. Portanto, temos: N = + M x B+ E Onde, N – número que se deseja representar + - sinal do número M – dígitos significativos do número ( mantissa) B – base de exponenciação + E – valor do expoente, com seu sinal Dessa forma é possível manipular precisão (número de dígitos significativos da mantissa) e grandeza (expressa pelo expoente) do número. Representação normalizada Existem diferentes maneiras de escrever o mesmo número. A forma normalizada é aquela que apresenta um único dígito, diferente de zero, antes da vírgula. Exemplo: 110101 = 1,10101x25 ou, escrevendo-se o próprio 5 também na base dois, 1,10101x2101. A base 2 está sendo mantido na forma decimal, 2 , e não na binária 10 , porque ela não precisará ser representada, por ser implícita. Chama-se mantissa ao número 1,10101 e expoente ao número 101, deste exemplo. Seguem-se outros exemplos: 1110,01 ou 1,11001 x 23 ou 1,11001 x 211 , que corresponde a 14,25, em decimal. 0,0011 ou 1,1 x 2-3 ou 1,1 x 2-11 , que corresponde a 0,1875 em decimal. 0,1001 ou 1,001 x 2-1 , que corresponde a 0,5625 em decimal. Pode-se observar que, para se representar um número real, é necessário armazenar a mantissa e o expoente, sendo dispensável representar o "1,", por estar sempre presente, sendo, também, desnecessário, armazenar o dois, base do sistema. 27 Conversão para Ponto Flutuante Para um dado sistema, a representação em Ponto Flutuante é especificada a partir da identificação dos seguintes elementos: 1. Quantidade de palavras de dados (total de bits/bytes da representação). 2. Modo de representação da mantissa (normalizada, etc.,). 3. Modo de representação do expoente. 4. Quantidade de bits definida para a mantissa e para o expoente. 5. A posição, no formato, do sinal do número, da mantissa e do expoente. 6. O valor da base de exponenciação Como exemplo, considere o formato abaixo: Considerando o formato acima, como seria a representação interna de 407,37510? 1. Conversão direta para a base: N = 407,37510 = 110010111,0112 = 110010111,011 x 2 0. 2. Mantissa normalizada: N = 1,10010111011 x 28. 3. Determinação dos valores: S= 0 (número positivo). E= 0001000. M= 10010111011000000000000, pois não há necessidade de representar o 1 antes da vírgula, que na forma normalizada sempre estará presente. 28 Representação interna: 0 0001000 100101110110000000000000 Faixa de Representação Como vimos anteriormente, a representação em ponto flutuante tem limites de alcance e de precisão. O alcance é limitado pelo número de bits do expoente. A precisão é determinada pelo número de bits da mantissa. Ocorre overflow quando o valor absoluto do dado a ser representado excede a capacidade de representação, porque o número de bits do expoente (neste caso, positivo) é insuficiente para representar o dado. Um outro problema ocorre na região de números próximos de zero, que tem o maior expoente negativo possível. Ocorre underflow quando o valor absoluto do dado a ser representado é tão pequeno que fica menor que o menor valor absoluto representável. Nesse caso, o expoente é negativo mas não representa os números muito próximos de zero e ocorre uma descontinuidade na representação, com os números próximos a zero não sendo representados. Underflow não é o mesmo que imprecisão. Dados na faixa de underflow não podem ser representados, ocorrendo estouro no expoente. No caso de imprecisão, a normalização permite que o dado seja representado, porém com perda de precisão. Observe que temos sete regiões distintas, conforme o quadro: 29 Exemplo: E= 2 dígitos, B= 10, M= 3 dígitos. mNN= -0,999 x 1099. MNN= -0,100 x 10-99. mNP= 0,100 x 10-99. MNP= 0,999 x 1099. CARACTERÍSTICA Característica é o expoente, representado na forma de excesso de n, ou seja, CARACTERÍSTICA = EXPOENTE + EXCESSO Para se definir a maneira como o computador armazenará o número real em ponto flutuante, é preciso definir o número de bits que ele usará para representar a mantissa e o número de bits para o expoente. Suponha-se que um determinado computador reserve 1 byte, isto é, 8 bits, para representar os números reais. Admita-se que usa o primeiro bit para sinal do número, três bits seguintes para o expoente e os últimos quatro bits para o restante da mantissa. bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 O bit 0 indica o sinal do número: 0 positivo, 1 negativo. Os bits 1, 2 e 3 constituem o expoente e precisam representar tanto expoentes positivos quanto expoentes negativos. Com esses três bits, há 8 possibilidades: 000, 001, 010, 011, 100, 101, 110, 111, que representariam números de 0 até 7. Isso não serviria pois precisamos de expoentes negativos, além dos positivos. Deram-se aos expoentes 000 e 111 significados especiais, a serem tratados daqui a pouco. Como devemos representar expoentes tanto negativos, para os números menores que zero, quanto positivos, para números maiores que zero, vamos assumir que o número 3, isto é, 011 represente o expoente zero. Os anteriores representarão os expoentes negativos e os posteriores os expoentes positivos. Dessa maneira, o número que representa o expoente será o número em binário menos três, conforme tabela a seguir. 30 Bits 001 010 011 100 101 110 valor 1 2 3 4 5 6 expoente -2 -1 0 1 2 3 É importante observar que num número diferente de zero, normalizado na base 2, a mantissa sempre começará por 1. Assim sendo, não há necessidade de se representar o (1. ) pois isso ficaria implícito, bastando representar os dígitos que aparecem depois da vírgula. Sendo m o número de bits representados da mantissa, o número representado terá, sempre, m+1 dígitos. Observem-se os exemplos a seguir: 3,5 .… 11,1 … 1,11 x 21 … 1,1100 x 21 … 01001100 2,75 …. 10,11 … 1,0110 x 21 … 01000110 7,5 .… 111,1 … 1,1110 x 22 … 1,1110 x 210 … 01011110 -7,25 .… -111,01 … -1,1101 x 22 … -1,1101 x 210 … 11011101 -0,375.… -0, 011 … -1,1000 x 2-2 … -1,1000 x 2-10 … 10011000 Como se pode ver, o maior número positivo que pode nele ser representado é: 0 1 1 0 1 1 1 1 que corresponde a 1,1111 x 23 , isto é: 1111,1, ou 15,5. 31 O menor número positivo seria: 0 0 0 1 0 0 0 0 que corresponde a 1,0000 x 2-2 , isto é: 0,25. Lembremo-nos que os expoentes 000 e 111, não foram considerados, até agora; eles tem tratamento especial. Usa-se o expoente 000 , quando se quer indicar que o número não está normalizado, ficando o 000 como o menor expoente, isto é, -2 , no nosso exemplo. A mantissa passa a ser 0, _ _ _ …. Onde, depois da vírgula, estão os dígitos da mantissa, só que, agora, sem a precedência do (1, ) , como era antes, e sim (0, ). Neste caso, não teremos, mais, m+1 dígitos significativos, como tínhamos quando os números eram normalizados. O expoente 111 é reservado para representar mais infinito, com zero na frente (01110000) e menos infinito com 1 na frente (11110000), em ambos os casos a mantissa sendo 0000. O mesmo expoente 111 é ainda utilizado para caracterizar indeterminação, 11111000. As demais combinações com o expoente 111 não são válidas, sendo consideradas (not a number).A representação substituindo expoente por característica acarreta que todas as características serão positivas, de forma que é possível eliminar a representação do sinal do expoente. SeCARACTERÍSTICA = EXPOENTE + EXCESSO, sendo M o número de bits para a representação da característica, temos: 0 = - 2M-1 + EXCESSO logo: EXCESSO = + 2M-1 Ex: 2M-1 = 2 8-1 = 2 7 32 EXEMPLO DE REPRESENTAÇÃO EM PONTO FLUTUANTE Representação com base 2 (PDP 11- o primeiro computador/processador de 16 bits da DIGITAL EQUIPAMENT CORPORATION. O PDP-11 inaugurou o conceito de compatibilidade, que poupava tempo e dinheiro ao usuário. Permitia transportar aplicações de máquinas de menor porte para maior porte, e vice-versa; eliminava a necessidade de reescrever software e reduzia os investimentos em periféricos.) Os microcomputadores podem representar os dados em ponto flutuante com base implícita = 2, no seguinte formato: sendo SN = sinal do dado CARACTERÍSTICA = o expoente, representado na forma de excesso de n, ou seja, CARACTERÍSTICA = EXPOENTE + EXCESSO No caso, o excesso é de 12810, portanto: CARACTERÍSTICA = EXPOENTE + 12810 Exemplificando: expoente = - 28 logo característica = - 2810 + 12810 = 10010 Assim, uma característica entre 0 e 12710 significa que o expoente é negativo, enquanto uma característica entre 129 e 255 significa que o expoente é positivo (característica igual a 1280 significa expoente igual a 0). Exemplo: Representar 25,510 Como a base implícita é 2, vamos converter para binário: 2510 = 110012 Parte fracionária: 0.5 x 2 = 1,0 Logo: 25,510 = 11001,12 x 2 0 Normalizando: 11001,12 x 2 0 = 1,100112 x 2 4. Como o primeiro dígito da mantissa será sempre 1, no caso da base 2, economiza-se um bit na mantissa não armazenando o primeiro bit da mantissa, já que está implícito que todos os números terão mantissa iniciando com 1. Em binário com 23 bits, a mantissa normalizada será (lembrando que o primeiro bit 1 não é representado): 100.1100.0000.0000.0000.0000 Obs.: Como o número 1,100112 será representado em 23 bits, os bits não representativos (à direita) serão preenchidos com zeros. Como o expoente é 4, a característica será: 410 + 12810 = 13210. Em binário com 8 bits, será: 1000 0100 Portanto, a representação será: 33 O Padrão IEEE – 754 O Instituto de Engenharia Elétrica e Eletrônica ou IEEE é uma organização profissional e não-lucrativa, fundada nos Estados Unidos. É a maior (em número de sócios) organização profissional do mundo. A IEEE foi formada em 1963 pela fusão do Instituto de Engenheiros de Rádio (IRA) com o Instituto Americano de Engenheiros Elétricos (AIEE). O IEEE tem filiais em muitas partes do mundo, sendo seus sócios engenheiros elétricos, cientistas da computação, profissionais de telecomunicações, etc. Sua meta é promover conhecimento no campo da engenharia elétrica e eletrônica. Um de seus papéis mais importantes é o estabelecimento de padrões para formatos de computadores e dispositivos. A norma IEEE 754, publicada em 1985, procurou uniformizar a maneira como as diferentes máquinas representam os números em ponto flutuante, bem como devem operá-los. Essa norma define três formatos básicos para os números em ponto flutuante: o formato simples, com 32 bits, o duplo com 64 bits e o quádruplo com 128 bits (ainda existem o simples estendido e o duplo estendido). O primeiro bit é para o sinal: 0 representa número positivo e 1 representa número negativo. No formato simples o expoente tem 8 bits e a mantissa tem 23 bits; no formato duplo, o expoente tem 11 bits e a mantissa 52 bits e no formato quádruplo, o expoente tem 15 bits e a mantissa 111 bits, sendo o primeiro bit 1 normalizado representado neste formato. No formato simples, o menor expoente é representado por 00000001, valendo -126, e o maior expoente é representado por 11111110, valendo +127. Em ambos os casos, o expoente vale o número representado em binário menos 127. No formato duplo, o menor expoente é representado por 00000000001, valendo - 1022, e o maior expoente é representado por 11111111110, valendo +1023. Em ambos os casos, o expoente vale o número representado em binário menos 1023. Além dos formatos básicos, a norma ainda define o formato estendido, com 80 bits e o formato quádruplo, com 128 bits. Uma mantissa normalizada começa com um ponto binário, seguido por um bit 1 e depois pelo resto da mantissa. padrão IEEE 754 consiste no primeiro 1 da mantissa oculto, um ponto oculto e depois os bits da fração. Isto é denominado "significando". 34 Todos os números normalizados tem um significando S, no intervalo: 1 S 2 Não é permitido ao número normalizado ter um expoente só de zeros, ou de só de uns. FORMATOS Simples Duplo Largura do formato 32 64 Mantissa 23 52 Expoente Emáx +127 +1023 Emín -126 -1022 Característica +127 +1023 Largura 8 11 Exemplo: Mostrar a representação do valor -0,7510 no formato de ponto flutuante padrão IEEE 754 para precisão simples. O valor -0,7510 também pode ser representado como 1,12x2 -1 Usando a forma geral de representação de números em ponto flutuante usando o padrão IEEE 754, em precisão simples: 1 01111110 10000000000000000000000 35 Nesta notação, cinco grupos diferentes de números podem ser representados: números normalizados, zero, números não-normalizados, infinito e não-números (NaN): 1. Os números normalizados utilizam um expoente que vai de 1 a 254 (ou 1 a 2046, ou 1 a 32766), o primeiro bit da mantissa (L) é sempre um e por isto não é representado. 2. O Zero é representado por um número todo em zero (E=F=L=0); note-se que o zero neste caso pode ter sinal. 3. Números não normalizados possuem o expoente em zero (E=0) e uma fração não zero. Seu uso é restrito para representação do números que não podem ser normalizados sem causar ―underflow‖. 4. O Infinito é representado pelo maior valor do expoente (E=255 ou 2047 ou 32767) e por uma fração em zero (F=L=0). Note-se que o infinito pode ter sinal. 5. Não-números (Not a Number) são representados pelo maior expoente e por uma fração diferente de zero. Seu uso previsto inclui a indicação de códigos de erro, situações imprevistas, etc. O bit de sinal (S) é representado no bit mais significativo; os bits seguintes representam o expoente. Os bits menos significativos são destinados à mantissa. Note-se que o bit L não é representado (exceto na notação quádrupla). 36 Capítulo II - ÁLGEBRA DE BOOLE Introdução A manipulação de informações pode ser dividida em três partes básicas: a obtenção dos dados, o processamento desses dados e a geração de novos dados. Toda ação envolve, de certa forma, tomadas de decisão. Compreender o raciocínio humano que rege as tomadas de decisão possibilita que o mecanismo seja implantado em sistemas artificiais. A lógica pode ser vista como um ramo de estudos da matemática que fornece elementos para a tentativa de modelagem do raciocínio humano. A lógica formal fornece uma linguagem estruturada para a definição e a manipulação de argumentos. Argumentos são conjuntos de enunciados, dos quais um deles é definido como conclusão e os demais como premissas. Quanto à validade, os argumentos podem ser divididos em: dedutivos e indutivos. Em um argumento dedutivo, premissas verdadeiras conduzem a uma conclusão verdadeira. Nos argumentos indutivos, premissas verdadeiras não garantem uma conclusão verdadeira. A lógica dedutiva pode ser dividida em: clássica, complementar, e não-clássica. Atualmente, a lógica clássica é mais conhecida como Cálculo de Predicados de Primeira Ordem. Exemplos de lógica complementar são: modal (qualquer sistema de lógica formal queprocure lidar com modalidades, tratar de modos quanto a tempo, possibilidade, probabilidade, etc.), deôntica (tipo de lógica modal usada para analisar formalmenteas normas ou as proposiçõesque tratam acerca das normas) e epistêmica (que se refere à epistemologia, à teoria do conhecimento, reflexão sobre a natureza, o conhecimento e suas relações entre o sujeito e o objeto). Alterando-se os princípios da lógica clássica, surgem as lógicas não-clássicas. Alguns exemplos são: paracompletas, intuicionistas, não-aléticas, não-reflexivas, probabilísticas, polivalentes, fuzzy, etc. Nesse estudo será abordado apenas um tipo de lógica: binária, bivalente ou clássica. Os argumentos serão representados por proposições. Uma proposição é uma sentença afirmativa declarativa (ou uma afirmação declarativa ou uma assertiva ou um statement) sobre a qual faz sentido se afirmar que a mesma é verdadeira ou falsa. Valores fixos e variáveis na lógica binária: – As variáveis representam assertivas (ou proposições ou argumentos). – Só existem dois valores fixos que podem ser atribuídos a uma variável. – Os dois valores devem ser, do ponto de vista lógico, mutuamente excludentes. Modelagem lógica de um problema real: A formulação de um problema real envolve diversas representações ou codificações. Problema real → um sistema formado por um conjunto de assertivas (statements), associadas por meio de conectivos (operadores ou funções). Conectivo → elemento de conexão que é modelado por uma função lógica. 37 Assertiva → afirmação declarativa (statements) sobre algum elemento do problema, a qual é representada por uma variável de asserção do sistema. Variável de asserção → variável do sistema associada a uma assertiva, à qual será atribuído um valor fixo lógico (truth value). Valor fixo lógico → representação do estado de uma variável de asserção por meio de um símbolo com significado lógico, por exemplo: F/T, F/V, 0/1, 0/5 ou +12/-12. Uma vez que os dois valores fixos possíveis são mutamente excludentes, naturalmente surge a idéia de negação (da associação de assertivas, do conectivo, da assertiva, da variável de asserção, do valor ou do símbolo). (Fonte: Apostila do Departamento de Engenharia de Telecomunicações da Universidade Federal Fluminense(Alexandre Santos de la Veja) 2.2 Álgebra Booleana ou Álgebra de Boole O nome Álgebra Booleana é em homenagem ao matemático inglês George Boole que em 1854, publicou um livro clássico. Uma investigação das leis do pensamento sobre as quais são baseadas as teorias matemáticas da lógica e das probabilidades. O propósito estabelecido por Boole era o de realizar uma análise matemática da lógica. A Álgebra de Boole surgiu inicialmente por ter relações com os problemas que apareceram no projeto de circuitos de chaveamento com relês em 1938, Claude E. Shannon que era assistente de pesquisa no departamento de engenharia elétrica no MIT, em uma versão de sua tese para o grau de mestre de ciências que foi publicada sob o título A Symbolic Analysis of Relay and Switching Circuits. Este artigo apresentava um método para representação de qualquer circuito consistindo de combinações de chaves e réles por um conjunto de expressões combinações matemáticas, e foi desenvolvido um cálculo para manipular estas expressões. O cálculo usado baseava-se comprovadamente na álgebra booleana. A lógica booleana é a base dos sistemas binários. Usando um sistema de equações booleanas é possível representar qualquer algoritmo ou qualquer circuito eletrônico do computador. A álgebra booleana é um sistema de dedução matemática restrito aos valores zero e um (falso e verdadeiro). Operadores binários definidos para este conjunto de valores aceitam um par de entradas booleanas e produzem um valor booleano único. Por exemplo, o operador booleano AND aceita duas entradas booleanas e produz uma única saída booleana (o AND lógico das duas entradas). 2.3 Postulados da Álgebra de Boole A Álgebra de Boole é um sistema constituído por um conjunto S, duas operações fechadas ( + , ou, e . , e) definidas sobre S, e por um conjunto de postulados. 38 A operação simbolizada por + é chamada operação OU (ou OR). A operação simbolizada por . é chamada operação E (ou AND). Os símbolos + e . não tem o mesmo significado dos símbolos aritméticos usados para as operações aritméticas de adição e multiplicação. Uma operação é dita fechada sobre um conjunto se, quando aplicadas a dois ou mais elementos pertencentes ao conjunto, origina um outro elemento também pertencente ao conjunto. Por exemplo: Se a Є S Є = pertence e b Є S, então (a + b) Є S (a . b) Є S P.1 Associatividade de + e . (a + b) + c = a + (b + c) (a . b) . c = a . (b . c) P.2 Comutatividade de + e . (a + b) = (b + a) (a . b) = (b . a) P.3 (Existência) de um único elemento unitário em relação à operação + 0 + a = a + 0 = a elemento unitário P.4 (Existência) de um único elemento unitário em relação à operação . 1 . a = a . 1 = a elemento unitário P.5 Distributividade de + sobre . a + (b . c) = (a + b) . (a + c) P.6 Distributividade de . sobre + a . (b + c) = (a . b) + (a . c) 39 P.7 Existência de um complemento ( a) ( ā) tal que, = qualquer que seja a . ā = 0 a + ā= 1 Aplicação: Qual o complemento de O ? Por P.3, O + Ō = 1 Ō = 1 e O . Ō = O, donde O . 1 = O Ō = 1 2.4 Teoremas Fundamentais Teorema de De Morgan Axiomas: As variáveis podem tomar um dos valores {0,1} Se X = 0 então X ≠ 1 Se X = 1 então X ≠ 0 Obs.: Um computador clássico tem uma memória feita de bits. Cada bit contém um um ou um zero. Um computador quântico mantém um conjunto de qubits. Um qubit pode conter um um, um zero ou uma sobreposição de um e zero. Em outras palavras, pode conter tanto um um como um zero ao mesmo tempo. O computador quântico funciona pela manipulação destes qubits. 40 Teoremas 2.5 Funções Booleanas Chama-se função booleana a uma dada expressão envolvendo elementos e operações da álgebra de Boole. Exemplos: f1 (a,b,c) = a . b + ā . b . c + b . c f2 (A, B, C, D) = Ā . B + Ā .B . C . D + Ā Obs.: A notação E, simbolizada pelo . pode ser omitida, podendo-se representar a operação a . b simplesmente por ab. TABELA VERDADE (TV) São tabelas que representam todas as possíveis combinações das variáveis de entrada de uma função, e os seus respectivos valores de saída. A determinação da tabela verdade de uma função envolve os seguintes procedimentos: 1) Preenchimento das colunas referentes às variáveis da função, registrando-se todas as combinações de 0‘s e 1‘s que as variáveis podem assumir. Se a função possuir N variáveis, então o número de combinações é igual a 2N. Esse número é igual ao número de linhas da tabela verdade. 2) Preenchimento de colunas envolvendo expressões intermediárias. Aqui o número de colunas depende d complexidade da função. 3) Preenchimento da coluna de saída, que é uma manipulação lógica das colunas que envolvem expressões intermediárias e da função em si. 41 Exemplo: Representar numa TV a função: f (a,b,c,d) = a . (a + b . d . c) a b c d d c b d c a + b. d . cf (a,b,c,d) 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 Expressões intermediárias Quando uma função é igual a 1, diz-se que ela existe, ou que é verdadeira, ou que assume o nível lógico alto. Quando uma função é igual a 0, diz-se que ela não existe, ou é falsa, ou que assume o nível lógico baixo. Passagem da Tabela Verdade para a expressão algébrica. Seja a Tabela Verdade: a b f 0 0 1 0 1 0 1 0 1 1 1 1 1. O número de termos é igual ao número de 1‘s (huns)da função. No caso o número de termo é 3. 2. Cada termo possui todas as variáveis interligadas pele operação . (E), considerando-se a variável barrada se, para uma dada linha onde f é igual a 1(hum), a mesma for 0 (zero). 3. Agrupe os termos na função interligando-os pela operação + ou . Pode-se obter f como uma somatória de termos onde aparecem todas as variáveis observando- se as regras a seguir: 42 Portanto: 2.6 Aplicações da Álgebra Booleana : Álgebra dos Circuitos A introdução da Álgebra Booleana no estudo dos circuitos deve-se ao matemático americano Claude Elwood Shannon (A Symbolic Analysis of Relay and Switching Circuits - 1938). Como vimos, os operadores lógicos são representados por: _____ NOT --> (uma barra horizontal sobre o termo a ser invertido ou negado). E ------> . (um ponto, como se fosse uma multiplicação) OU ----> + (o sinal de soma) As expressões booleanas podem ser implementadas fisicamente usando-se portas eletrônicas ou relês. Cada porta eletrônica é um circuito que tem uma ou mais entradas e somente uma saída, que é uma função lógica da entrada. Tanto as entradas das portas quanto as saídas assumem níveis de tensão referidos como níveis lógicos 0 ou 1. Tendo o surgimento em torno do século XIX o Relê é um dispositivo eletromecânico, formado por um magneto móvel, que se desloca unindo dois contatos metálicos. O Relê pode-se dizer que foi muito utilizado nos sistemas telefônicos no tempo das centrais analógicas nas localidades mais remotas. Relé industrial miniatura. 43 Utilização e Aplicações dos Relés Imagem 1 Benefícios para a utilização de relés - Um relé pode acionar mais de um circuito ao mesmo tempo com único sinal; - Os sinais de saída são completamente isolados e independentes dos de entrada; - A tensão do controle (bobina) pode ser muito menor que a dos contatos (saída); - Um relé pode controlar sinais DC através de tensão AC e vice-versa. Imagem 2 Aplicações para relés -Isolação elétrica entre motores/solenóides em campo e circuitos de comando; - Proteção de entradas e saídas de CLP através da isolação galvânica; -Segurança para acionamentos de cargas de alta corrente através de sinais de baixa corrente. Para mais informações consulte: http://www.newtoncbraga.com.br/index.php/como-funciona/597-como-funcionam-os- reles?showall=1&limitstart. As Portas lógicas ou circuitos lógicos, são dispositivos que operam um ou mais sinais lógicos de entrada para produzir uma e somente uma saída, dependente da função implementada no circuito.São geralmente usadas em circuitos eletrônicos, por causa das situações que os sinais deste tipo de circuito podem apresentar: presença de sinal, ou "1"; e ausência de sinal, ou "0". As situações "Verdade" e "Falso", como vimos, são estudadas na Lógica Matemática ouLógica de Boole; origem do nome destas portas. O comportamento das portas lógicas é conhecido pela Tabela Verdade que apresenta os estados lógicos das entradas e das saídas. Diagramas de Portas Lógicas. 44 As Portas Lógicas e Relés atuam de modo semelhante à abertura e fechamento de interruptores. Um interruptor é um dispositivo ligado a um ponto de um circuito, que pode assumir um dos dois estados, "fechado" ou "aberto". No estado "fechado" (que indicaremos por 1) o interruptor permite que a corrente passe através do ponto, enquanto no estado "aberto" (que indicaremos por 0) nenhuma corrente pode passar pelo ponto. Assim, considerando-se os operadores lógicos booleanos, NOT, AND e OR poderíamos ter as seguintes tabelas verdades e sua implementação com interruptores: Função e Tabela Verdade Circuito com Interruptores 2.7 Formas Canônicas A partir da tabela verdade, é possível chegar à expressão que representa o comportamento de um circuito, e em seguida construir o circuito, usando as portas lógicas já estudadas. O processo de elaboração da expressão usa as chamadas formas canônicas, que consistem em regras para representar as condições de entrada que: a) produzirão saída 1 (e portanto as demais condições produzirão saída 0) ou alternativamente, b) produzirão saída 0 (e portanto as demais condições produzirão saída 1). São, portanto, duas as formas canônicas: a) Forma normal disjuntiva: quando ela está formada pela soma de MINITERMOS. Um minitermo é um produto de todas as variáveis da função (barradas ou não) - representa as condições que produzem saída 1; 45 b) Forma normal conjuntiva: quando está representada por produtos de MAXITERMOS. Um maxitermo é representado pela soma de todas as variáveis (barradas ou não) da função - representa as condições que produzirão saída 0. Exemplos: Minitermos: Maxitermos: Essas formas são alternativas, isto é, a expressão poderá ser encontrada aplicando-se alternativamente UMA ou OUTRA das formas. Soma dos Minitermos É produzida construindo: um termo (uma sub-expressão) para cada linha da tabela verdade (que representa uma combinação de valores de entrada) em que a saída é 1, cada um desses termos é formado pelo PRODUTO (FUNÇÃO AND) das variáveis de entrada, sendo que: quando a variável for 1, mantenha; quando a variável for 0, complemente-a (função NOT). a função booleana será obtida unindo-se os termos PRODUTO (ou minitermos) por uma porta OR (ou seja, "forçando-se" a saída 1 caso qualquer minitermo resulte no valor 1). Dessa forma, ligando os termos-produto (também chamados minitermos) pela porta OR, caso QUALQUER UM dos minitermos seja 1 (portanto, caso qualquer uma das condições de valores de entrada que produz saída 1se verifique), a saída pela porta OR será também 1. Ou seja, basta que se verifique qualquer uma das alternativas de valores de entrada expressos em um dos minitermos, e a saída será também 1, forçada pelo OR. Caso nenhuma dessas alternativas se verifique, produz-se a saída 0. Exemplo: 46 PRODUTO DOS MAXITERMOS É produzida construindo: um termo (uma sub-expressão) para cada linha da tabela verdade (que representa uma combinação de valores de entrada) em que a saída é 0, cada um desses termos é formado pela SOMA (FUNÇÃO OR) das variáveis de entrada, sendo que: quando a variável for 0, mantenha; quando a variável for 1, complemente-a (função NOT). a função booleana será obtida unindo-se os termos SOMA (ou maxitermos) por uma porta AND (ou seja, "forçando-se" a saída 0 caso qualquer minitermo resulte no valor 0). Dessa forma, ligando os termos-soma
Compartilhar