Representação de um número num computador
Chama-se representação (ou codificação) de um número à maneira segundo a qual é descrito sob forma binária. A representação dos números num computador é indispensável para que este o possa armazenar e manipular. Contudo, o problema é que um número matemático pode ser infinito (tão grande quanto quisermos), mas a representação de um número num computador deve ser feita num número de bits predefinido. Trata-se por conseguinte de predefinir um número de bits e a maneira de os utilizar de modo que estes sirvam o mais eficazmente possível para representar a entidade. Assim, seria estúpido codificar um caracter em 16 bits (65536 possibilidades) enquanto que se utiliza geralmente menos de 256…
Representação de um inteiro natural
Um número inteiro natural é um inteiro positivo ou nulo. A escolha a fazer (quer dizer o número de bits a utilizar) depende do intervalo de números que se deseja utilizar. Para codificar números inteiros naturais compreendidos entre 0 e 255, serão suficientes 8 bits (um octet) porque 28=256. Geralmente, uma codificação em n bits poderá permitir representar números inteiros naturais compreendidos entre 0 e 2n-1
Para representar um número inteiro natural após ter definido o número de bits sobre o qual o codificamos, basta arrumar cada bit na célula binária que corresponde ao seu peso binário da direita para a esquerda, seguidamente “preenchemos” os bits não utilizados por zeros.
Representação de um inteiro relativo
Um inteiro relativo é um número inteiro que pode ser negativo. É necessário por conseguinte codificar o número de modo a que se possa saber se se trata de um número positivo ou de um número negativo, e é necessário também que as regras de adição sejam conservadas. O truque consiste em utilizar uma codificação que se chama complemento a dois.
- um inteiro relativo positivo ou nulo será representado em binária (base 2) como um inteiro natural, com a única diferença que o bit de peso forte (o bit situado à extrema esquerda) representa o sinal. É necessário por conseguinte assegurar-se, para um inteiro positivo ou nulo que ele está a zero (o 0 corresponde a um sinal positivo, 1 a um sinal negativo). Assim se codificamos um inteiro natural em 4 bits, o maior número será 0111 (quer dizer, 7 em base decimal).
Geralmente, o maior inteiro relativo positivo codificada em
n bits será
2n-1-1.
- um inteiro relativo negativo graças à codificação em complemento a dois.
Princípio do
complemento a dois:
Para representar um número negativo.
*
- Tomemos o seu oposto (o seu equivalente positivo)
- Representemo-lo em base 2 sobre n-1 bits
- Complementamos cada bit (invertemos, quer dizer que se substituem os zeros pelo 1 e vice-versa)
- Acrescenta-se 1
Observará que acrescentando o número e o seu complemento a dois obtem-se 0…
Vejamos agora um exemplo:
Deseja codificar o valor -5 em 8 bits. Basta:
- escrever 5 em binário: 00000101
- complementar a 1: 11111010
- acrescentar 1 : 11111011
- a representação binária de -5 em 8 bits é 11111011
Observações :
O bit de peso forte é 1, tem-se por isso efectivamente um número negativo.
Se se acrescentar 5 e -5 (00000101 e 11111011) obtém-se 0 (com uma retenção de 1…).
Representação de um número real
Se se trata de representar um número binário com vírgula (por exemplo 101,01 que não se lê cento e um vírgula zero um dado que é um número binário, mas 5,25 em decimal) sob a forma 1,XXXXX... * 2n (quer dizer no nosso exemplo 1,0101*22). A norma IEEE define a maneira de codificar um número real.
Esta norma propõe codificar o número em 32 bits e define três componente:
- o sinal é representado por por um só bit, pelo bit de peso forte (o mais à esquerda)
- o expoente é codificado nao 8 bits consecutivos ao sinal
- a mantissa (os bits situados após a vírgula) nos 23 bits restantes
Assim, a codificação faz-se sob a forma seguinte:
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
- o s representa o bit relativo ao sinal
- os e representam os bits relativos ao expoente
- os m representam os bits relativos à mantissa
Certas condições devem contudo respeitar-se para os expoentes:
- o expoente 00000000 é proibido
- o expoente 11111111 é proibido. Serve contudo para assinalar erros, chama-se então a esta configuração do número NaN, que significa Not a number
- É necessário acrescentar 127 (01111111) ao expoente para uma conversão de decimal para um número real binário. Os expoentes podem assim ir de -254 à 255
A fórmula de expressão dos números reais é assim a seguinte :
(-1)^S * 2^( E - 127 ) * ( 1 + F )
onde :
- S é o bit de sinal e compreende-se então porque 0 é positivo (-1^0=1).
- E é o expoente ao qual se deve acrescentar 127 para obter o seu equivalente codificado.
- F é a parte fraccionária, a única que se exprime que é acrescentada a 1 para efectuar o cálculo.
Vejamos esta codificação num exemplo:
Codificar o valor 525,5.
- 525,5 é positivo por conseguinte o bit será 0.
- A sua representação numa base 2 é a seguinte: 1000001101,1
- Normalizando, encontra-se : 1,0000011011*2^9
- Acrescenta-se 127 ao expoente que vale 9 o que dá 136, quer dizer em base 2: 10001000
- A mantissa é composta pela parte decimal de 525,5 em base 2 normalizada, quer dizer 0000011011.
- Como a mantissa deve ocupar 23 bits, é necessário acrescentar zeros para a completar:
00000110110000000000000
- A representação do número 525,5 binário com a norma IEEE é por conseguinte:
0 1000 1000 00000110110000000000000
0100 0100 0000 0011 0110 0000 0000 0000 (4403600 hexadecimal)
Eis outro exemplo com um real negativo:
Codificar o valor -0,625.
- O bit s vale 1 porque 0,625 é negativa
- 0,625 escreve-se em base 2 da maneira seguinte: 0,101
- Desejamos escrevê-lo sob a forma 1.01 x 2-1
- Por conseguinte o expoente vale 1111110 porque 127 - 1 = 126 (quer dizer 1111110 em binário)
- a mantissa é 01000000000000000000000 (só os números após a vírgula são representados, o número inteiro sendo sempre igual a 1)
- A representação do número 0,625 binário com a norma IEEE é:
1 1111 1110 01000000000000000000000
1111 1111 0010 0000 0000 0000 0000 0000 (FF 20 00 00 hexadecimal)