Você está na página 1de 13

Sistemas Numricos

Sistema Decimal (base 10)


Descrevemos quantidades com nmeros na base decimal usando dez smbolos diferentes:
0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.
A regra para associar os nmeros s respectivas quantidades simples:
1. Comece com um nmero de apenas um dgito 0 ( para representar o zero) e marque
esta como a posio corrente (pc); imprima este nmero.
2. Repita:
a. Se o dgito na pc no o 9, substitua este dgito pelo prximona lista; imprima
este nmero; a pc no se altera.
b. Se o dgito na pc o 9, procure para a esquerda da pc pelo primeiro dgito que
no 0 9.
b1. Se encontrou esse dgito, o dgito dessa nova posio avana para o
prximo smbolo; substitua os dgitos da diretia dessa nova posio at a pc
por zeros; imprima o nmero; a pc passa a ser a prxima posio
esquerda da pc atual.
b.2 Se no encontrou esse dgito acresente o dgito 1 esquerda de todos os
demais; substitua os dgitos da diretia dessa posio at a pc por zeros;
imprima o nmero; a pc passa a ser a prxima posio esquerda da pc
atual.
Por exemplo:
00, 01, 02, ... 07, 08, 09 (o dgito direita reinicia, e o esquerda passa de 0 para 1)
10, 11, 12, ... 17, 18, 19 (o dgito direita reinicia, e o esquerda passa de 1 para 2)
20, 21, 22, ...
Por convenincia, omitimos os dgitos 0 esquerda do nmero.

Outros Sistemas Numricos


O sistema decimal no a nica maneira para se expressar quantidades. Existem outras
formas para contar quantidades. Uma alternativa comum a dzia, que contm 12
unidades. A grosa o resultado quando completamos 12 dzias (e reiniciamos a contagem
de dzias). Outra forma comum o sistema com 60 unidades. Por exemplo, ao expressar
minutos e segundos.
A forma mais simples o sistema unrio. Escolhe-se um smbolo (por exemplo, x) e o
repetimos tantas vezes quanto for o valor do nmero. Para representar o valor 7,
escreveramos xxxxxxx. Por ser muito primitivo, este sistema til somente para nmeros
pequenos. J os romanos preferiram utilizar I, II, III, IV, V, VI, VII, VIII,
IX, etc. Diante de tantas formas de representar nmeros, no de estranhar que no
exista uma nica opo universal.
Neste captulo, estudaremos os sistemas utilizados na linguagem C.

5/4/2010 15:44 1
Sistema Binrio (base 2)
Note que a escolha dos smbolos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9 foi totalmente arbitrria. Eles
poderiam ser substitudos por quaisquer outros, sem comprometer a contagem. No sistema
binrio, temos apenas dois smbolos (0 e 1) para compor nmeros. A regra continua a
mesma que aquela j enunciada para os nmeros decimais. Comeamos com o smbolo 0 e
para o prximo nmero, utilizamos o 1. O dgito esquerda avana para o prximo smbolo
(0 ou 1) e a contagem direita retorna para o smbolo 0.
000, 001
010, 011
100, 101
110, 111...

Sistema Octal (base 8)


Nesse sistema, representamos nmeros com oito smbolos (0, 1, 2, 3, 4, 5, 6 e 7). A
contagem ser:
00, 01, 02, 03, 04, 05, 06, 07
10, 11, 12, 13, 14, 15, 16, 17,
20, 21,

Sistema Hexadecimal (base 16)


NO sistema hexadecinal, representamos nmeros com dezesseis smbolos (0, 1, 2, 3, 4, 5,
6, 7, 8, 9, A, B, C, D, E e F). Como no possumos tantos dgitos numricos, convencionou-
se representar o smbolo depois do nove como A, depois B, e assim por diante.
A contagem ser:
00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F,
20, 21, 22, ...

Representaes
Tome o nmero 101. Qual a quantidade que ele representa? Isto depende do sistema
numrico em uso. Sem essa informao adicional, 101 um dado que pode ser
interpretado de diferentes maneiras, dependendo do sistema numrico.
Por este motivo, para evitar ambigidade, adotaremos a seguinte conveno: nmeros no
sistema decimal sero representados na forma convencional. Nos demais casos, as bases
sero indicadas como um subscrito no lado direito do nmero. Por exemplo: 101, 1012,
1018 ou 10116.
Dadas uma representao e a base do sistema numrico, fcil determinar a quantidade
representada:
Decimal (base 10): 10110 = 1102 + 0101+ 1100 = 10110
Binrio (base 2): 1012 = 122 + 021 + 120 = 510
Octal (base 8): 1018 = 182 + 081 + 180 = 6510

5/4/2010 15:44 2
Hexadecimal (base 16): 10116 = 1162 + 0161+ 1160 = 25710
Em geral, o valor de um nmero na base b, representado pelos dgitos
an an-1 an-2 ... a2 a1 a0
ser dado por:
n
[a n a n 1 a n 2 a 2 a1 a 0 ]b = a i b i .
i=0

Comparao entre sistemas numricos


Decimal Binrio Octal Hexadecimal
0 02 08 016
1 12 18 116
2 102 28 216
3 112 38 316
4 1002 48 416
5 1012 58 516
6 1102 68 616
7 1112 78 716
8 10002 108 816
9 10012 118 916
10 10102 128 A16
11 10112 138 B16
12 11002 148 C16
13 11012 158 D16
14 11102 168 E16
15 11112 178 F16
16 100002 208 1016
17 100012 218 1116
18 100102 228 1216
19 100112 238 1316
Tabela 1 Comparativo entre sistemas numricos

5/4/2010 15:44 3
Converses de base
Converso de base B para base decimal
Algoritmo de multiplicaes sucessivas
Um nmero N, representado na base B por An An-1 An-2 ... A2 A1 A0 pode ser reescrito na base
10 utilizando o algoritmo de multiplicaes sucessivas.
No passo inicial, o resultado ser zero. Para cada dgito Ai (comeando com An e
terminando em A0), multiplica-se o resultado pela base B e, em seguida, soma-se o valor do
dgito Ai.
Exemplo
Transformar 13058 (octal) para a base decimal:
Etapa: Valor: Dgito Novo Valor
0 0 ---- ----
1 08 +1 = 1
2 18 +3 = 11
3 11 8 +0 = 88
4 88 8 +5 = 709
5 709 FIM
Portanto, 13058 = 70910
Exemplo
Transformar 1E3116 (hexadecimal) para a base decimal:
Observao: no sistema hexadecimal, o smbolo A corresponde ao dcimo dgito, B ao
dcimo primeiro, e assim por diante. Logo, o smbolo E corresponder ao dcimo quarto
dgito.
Etapa: Valor: Dgito Novo Valor
0 0 ---- ----
1 0 16 +1 = 1
2 1 16 + E (14) = 30 (16 + 14 = 30)
3 30 16 + 3 = 483
4 483 16 + 1 = 7729
5 7729 FIM
Portanto, 1E3116 = 772910
Exemplo
Transformar 001010112 (binrio) para a base decimal:
Observao: podemos ignorar os dgitos no significativos esquerda.
Etapa: Valor: Dgito Novo Valor
0 0 ---- ----
1 02 +1 = 1
2 12 +0 = 2

5/4/2010 15:44 4
3 22 +1 = 5
4 52 +0 = 10
5 10 2 +1 = 21
6 21 2 +1 = 43
7 43 FIM
Portanto, 001010112 = 4310
Converso de base decimal para base b
Algoritmo de divises sucessivas
Um nmero N, representado na base decimal, aps ser convertido para a base b seria
representado como am am-1 ... a2 a1 a0. Para se obter os correspondentes smbolos na base b
podemos usar o o algoritmo de divises sucessivas.
Enquanto o nmero for no nulo, dividimo-lo pela base b. O resto da diviso ser o valor
do prximo dgito ai (de a0 at am), e o quociente passa a ser o novo valor a ser dividido na
etapa seguinte.
Exemplo
Transformar 2034 para a base octal:
Etapa: Valor: Quociente Resto
1 2034 8= 254 + 2
2 254 8= 31 + 6
3 31 8= 3 + 7
4 3 8= 0 + 3
Portanto, 203410 = 37628. Note que devemos ler a coluna Resto de baixo para cima.
Exemplo
Transformar 1253 para a base hexadecimal:
Etapa: Valor: Quociente Resto
1 1253 16 = 78 + 5
2 78 16 = 4 + 14 (E)
3 4 16 = 0 + 4
Portanto, 125310 = 4E516 .
Exemplo
Transformar 35 para a base binria:
Etapa: Valor: Quociente Resto
1 35 2= 17 + 1
2 17 2= 8 + 1
3 8 2= 4 + 0
4 4 2= 2 + 0
5 2 2= 1 + 0

5/4/2010 15:44 5
6 1 2= 0 + 1

Portanto, 3510 = 1000112 .


De base B para base b
A forma mais simples para se reescrever um nmero de uma base para a outra, primeiro
convert-lo para a base decimal (com o algoritmo de multiplicaes sucessivas) e, em
seguida, converter a representao obtida para a base desejada (com o algoritmo de divises
sucessivas).
A frmula a seguir representa o resultado das duas operaes:
n m
[ An An 1 An 2 ... A2 A1 A0 ] B = Ai B i = N = a j b j = [ a m a m 1 a m 2 ... a 2 a1 a 0 ]b
i=0 j=0

Converso entre binrio, octal e hexadecimal


A converso entre binrio, octal e hexadecimal particularmente simples.
Primeiro, consultando a tabela comparativa entre sistemas numricos, nota-se que um trio
de dgitos binrios corresponde exatamente a um dgito octal. Uma qudrupla de dgitos
binrios forma um dgito hexadecimal.
Exemplo
Converter 001101102 para hexadecimal resulta em 3616. Para tal, consultamos a tabela para
transformar cada quatro dgitos binrios em um dgito hexadecimal.
0 0 1 1 0 1 1 0

3 6
Converter 001101102 para octal resulta em 668. Para tal, consultamos a tabela para
transformar cada trs dgitos binrios em um dgito octal.
0 0 1 1 0 1 1 0

0 6 6

Sistemas numricos em C
J aprendemos que na linguagem C as constantes numricas inteiras so formadas por uma
seqncia de dgitos numricos sem ponto decimal. Elas so tratadas como nmeros
inteiros na base 10 (decimal). Para as demais bases, um prefixo indicar a base do sistema
de contagem. Em C, temos disponvies as seguintes bases:
Decimal: sem prefixo, e o primeiro dgito no pode ser 0 (zero).
Octal: comeam com o prefixo 0.
Hexadecimal: comeam com o prefixo 0x. Neste caso, alm dos dgitos 0, 1, 2, ...
9, pode-se utilizar tambm os smbolos A, B, C, D, E e F para compor o nmero.
Binria: no existe representao binria em C.

5/4/2010 15:44 6
Exemplos:
10, 132, 32179: O nmero, sem ponto decimal, que comea com 1, 2, 3, ..., 9
tratado como nmero inteiro na base 10 (decimal).
012, 0204, 076663: O nmero, sem ponto decimal, que comea com 0 tratado
como nmero inteiro na base 8 (octal).
0xA, ou 0xa, 0x84, 0x7dB3, ou 0x7DB3: O nmero, sem ponto decimal, que
comea com 0x tratado como nmero inteiro na base 16 (hexadecimal). Note que
no faz diferena utilizar maisculas ou minsculas.
Veja o seguinte trecho de cdigo:
i=20;
printf("i(dec)=%d\n",i);
// constante base 8
i=020;
printf("i(dec)=%d\n",i);
//constante base 16
i=0x20;
printf("i(dec)=%d\n",i);

A sada seria:
i(dec)=20
i(dec)=16
i(dec)=32

A primeira atribuio armazena 20 em i, o que confirmado pela primeira linha na sada.


A segunda atribuio armazena interpreta 20 na base 8, devido ao dgito 0 no incio, e
armazena o resultado em i. Confirmando: 2x8+0x8=16. A terceira atribuio armazena em
i o valor correspondente a 20 na base 16, como sugerido pelo prefixo 0x. O resultado
seria: 2x16+0x16 = 32.
Escrevendo na sada, nas trs bases bsicas.
J sebemos que o modificador %d, quando usado na rotina printf, coloca na sada o
valor da varivel correspondente, e escrito na base 10. Em C temos tambm os
modificadores %o para escrever um valor inteiro na base 8, e %x para escrever um valor na
base 16. A funo do modificador %X idntica a do modificador %x, exceto que agora os
smbolos hexadecimais so impressos em letras maisculas.
Outro ponto importante que valores escritos nas bases 8 e 16 so sempre entendidos como
positivos, i.e., o bit mais significativo no interpretado como um bit de sinal. Nestes
casos, todos os bits so interpretados como parte de um valor positivo, como se este fosse
do tipo unsigned.
O trecho de cdigo a seguir, armazena uma seqncia de bits em uma varivel e imprime
esse mesmo valor usando as trs interpretaes padro. Estamos supondo que ocomputador
usa 32 bits para armazenar valores tipo int. Alm disso, tambm temos uma funo que
imprime a seqncia de bits correspondente ao valor armazenado em uma varivel, usando

5/4/2010 15:44 7
32 bits. Note que, em C, no temos uma facilidade para imprimir diretamente a seqncia
de bits correspondente a um valor armazenado em uma varivel.
int i=22;
int j=0xfffffffe; // como se fosse -2
/* mesma sequencia de bits impressa de varias formas */
printf("Sequencia de bits de %d eh: ",i);
ImpSeqBits(i);
printf("Valores em decimal, octal e hexadecimal: \n");
printf("i(dec)=%d, i(oct)=%o, i(hex)=%x\n",i,i,i);
printf("----------------\n");
printf("Sequencia de bits de %d eh: ",j);
ImpSeqBits(j);
printf("Valores em decimal, octal e hexadecimal: \n");
printf("j(dec)=%d, j(oct)=%o, j(hex)=%x\n",j,j,j);
As primeiras duas linhas definem i e j como 22 e -2, respectivamente. A representao
de bits interna que o comptador usa para armazenar nmeros inteiros negativos faz com aue
o valor -2 seja representado pela seqncia de bits 0xfffffffe, se usarmos 32 bits.
Em seguida, a funo ImpSeqBits imprime a seqncia de bits correspondente ao valor
armazenado em i. A sada seria
Sequencia de bits de 22 eh: 00000000 00000000 00000000 00010110
Passando esse valor para a base 10 teramos: 1x16+0x8+1x4+1x2+0x1=22.
A prxima linha imprime o valor armazenado em i interpretando-o como um nmero
decimal, um nmero octal e um nmero hexadecimal:
Valores em decimal, octal e hexadecimal:
i(dec)=22, i(oct)=26, i(hex)=16
Note que 22=2x8+6, portanto 22 na base 8 corresponde a 26. E tambm 22=1x16+6, e da
22 na base 16 16.
A prxima linha confirma que o valor armazenado em j mesmo aquele que foi atribudo:
----------------
Sequencia de bits de -2 eh: 11111111 11111111 11111111 11111110
Escrevendo esses valores em decimal, octal e hexadecimal, resulta em:
Valores em decimal, octal e hexadecimal:
j(dec)=-2, j(oct)=37777777776, j(hex)=fffffffe
Usando a seqncia binria exposta acima, fica fcil verificar que os valores em octal e em
hexadecimal esto corretos. Na representao interna binria, se o primeiro bit 1 sinaliza
que ovalor armazenado negativo, se for 0, o valor representado positivo. Daremos mais
detalhes sobre este ponto logo em seguida. Note que a representao octal e hexadecimal
no tratam o primeiro bit como um bit de sinal. Elas simplesmente reportam diretamente
quais bits esto armazenados na varivel.
A funo ImpSeqBits fcil de ser programada:
void ImpSeqBits(int v) {
int j;
unsigned comp=0x80000000; // 32 bits com o primeiro sendo 1
unsigned val;
val=(unsigned) v;

5/4/2010 15:44 8
for(j=0; j<32; j++) { // 32 bits
if ( (j==8)||(j==16)||(j==24) ) {putchar(' ');} //separa os bytesna saida
if (val >= comp) { putchar('1'); } // 1 na posicao mais significativa
else { putchar('0'); } // 0 na posicao mais significativa
val=2*val; // equivale a deslocar uma casa para esquerda
}
putchar('\n');
}
Primeiro, o valor de v colocado em val, como unsigned. Em seguida, cada iterao
do for imprime um dos 32 bits de val.
O primeiro teste apenas coloca na sada um espao em branco, para separar cada 8 bits da
seqncia de 4 bytes de sada, facilitando sua leitura. Se o segundo teste for verdadeiro,
ento o bit mais significativo de val 1; caso contrrio 0.
A atribuio val=2*val desloca os bits de val uma casa para a esquerda. Note que
estamos trabalhando na base 2 e, nessa base, multiplicar por 2 equivale a um deslocamento
de uma casa para a esquerda. Desta forma, na prxima iterao, estaremos testando o
segundo bit mais significativo de val, e assim por diante.
A ltima linha termina a impresso dos 32 bits de v e passa o cursor para a prxima linha.

Valores na entrada nas trs bases bsicas.


Tambm podemos ler valores nas trs bases bsicas: decimal, octal e hexadecimal. Os
modificadores so os mesmos empregados para a impresso de valores nessas mesmas
bases, ou seja, %o l uma constante na base 8, e %x ou %X l uma constante na base 16.
Veja o cdigo abaixo:
int i;
// constante base 10
printf("Entre com numero na base 10: ");
scanf("%d",&i);
printf("Valor de i (em decimal)=%d\n",i);
// constante base 8
printf("Entre com numero na base 8: ");
scanf("%o",&i);
printf("Valor de i (em decimal)=%d\n",i);
//constante base 16
printf("Entre com numero na base 16: ");
scanf("%x",&i);
printf("Valor de i (em decimal)=%d\n",i);
Cada uma das partes l um valor da entrada em uma das trs bases. Note o uso dos
modificadores apropriados.
Ao ler um valor na base 8, o computador capturas os dgitos na base 8 sucessivamente, at
encontrar um dgito que no seja um dos dgitos da base 8. Assim, se na segunda leitura
entrarmos com 78, por exemplo, o modificador %o vai forar a leitura apenas o dgito 7.
Em seguida, o computador imprimir o valor 7 e a mensagem para entrar como um nmero
na base 16. O dgito 8, entretanto, ainda se encontra na entrada pois no foi lido pela
invocao anterior, na forma scanf("%o"). Logo, o prximo comando

5/4/2010 15:44 9
scanf("%x")vai ler o dgito 8, que um dgito vlido na base 16, armazenando esse
valor na varivel i. Em seguida, imprimir o valor 8 na sada.

Representao de nmeros no computador


Bits, Nibbles, Bytes e Palavras
Os computadores atuais operam somente com dois nveis de voltagem (por exemplo, 0V e
5V). Por este motivo, uma unidade de informao representada por uma das duas
voltagens (baixa ou alta). O significado atribudo a cada uma das voltagens depende do
computador, e normalmente ser 0 ou 1, falso ou verdadeiro, ou qualquer opo com duas
possibilidades.
Quando tratamos de nmeros, essa unidade de informao denominada bit (binary digit)
e representa o valor 0 ou o valor 1. Uma seqncia de 8 bits forma um byte. Cada meia
parte de um byte (4 bits) forma um nibble. Os computadores modernos trabalham com
palavras (words), que podem ser seqncias de 2, 4 ou 8 bytes (16, 32 ou 64 bits).
Representao binria no computador
O computador uma mquina que manipulao de bits. Qualquer informao
(principalmente nmeros) processada, armazenada, recebida ou enviada como uma
seqncia de bits. Por este motivo, todo valor precisa ser convertido para o sistema binrio
antes de ser manipulado pelo computador. Nesta representao, cada dgito da base binria
ser representado por um bit.
Em um byte, os bits so numerados da direita para a esquerda, comeando com 0 (bit
menos significativo) at 7 (bit mais significativo). muito comum encontrar as siglas
LSB (least significant bit) e MSB (most significant bit).
b7 b6 b5 b4 b3 b2 b1 b0
Bit mais Bit menos
significativo significativo

Um byte capaz de representar nmeros binrios de 000000002 at 111111112.


Transformando estes limites para base decimal, obtemos 0 e 255. Os bits b7b6b5b4b3b2b1b0
correspondem respectivamente aos dgitos a7a6a5a4a3a2a1a0 de um nmero em base binria.
claro que com dois bytes, ser possvel expressar um nmero binrio ainda maior. A
numerao dos bits continua da mesma forma: da direita para a esquerda, de 0 (bit menos
significativo) at 15 (bit mais significativo).
Byte mais significativo Byte menos significativo
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
Bit mais Bit menos
significativo significativo

O byte com o bit mais significativo chamado de byte mais significativo, o outro byte
chamado de byte menos significativo.
Nessa forma, podemos representar valores de 00000000000000002 at
11111111111111112, ou seja, de 0 at 65535.
Resumindo, uma seqncia de n bits pode representar valores variando de 0 at 2n-1.

5/4/2010 15:44 10
Tipos de Dados
Uma varivel em C est associada com uma posio de memria. O tipo da varivel
determina a quantidade de bits reservada para armazenar o valor da varivel.
Conseqentemente, o tipo do dado especifica quantos bits estaro disponveis para
armazenar os dgitos da representao binria de um nmero.
No Visual Studio .NET, compilando em uma plataforma Intel Pentium, os tipos inteiros
reservam memria conforme a tabela:

Tipo Quantidade de memria


Char 1 byte (8 bits)
signed char
unsigned char
(signed) short int 2 bytes (16 bits)
unsigned short int
(signed) int 4 bytes (32 bits)
unsigned int
(signed) long int 4 bytes (32 bits)
unsigned long int
(signed) long long int 8 bytes (64 bits)
unsigned long long int

Isto mostra porque uma varivel com tipo int capaz de armazenar nmeros maiores que
uma varivel short int: simplesmente pelo fato de possuir o dobro do nmero de bits e,
portanto, sendo capaz de armazenar o dobro de dgitos na representao binria.
signed vs. unsigned int
Em C, para cada tipo inteiro, existe a opo signed e unsigned (consulte o captulo
Outros Tipos Inteiros). Com o conhecimento da representao binria de nmeros,
possvel explicar melhor a diferena entre estas duas opes.
unsigned
Uma varivel inteira de tipo unsigned utiliza uma palavra de n bits, onde n depende do
tipo da varivel: char, short int, long int ou long long int.
A estrutura de um unsigned char est ilustrada abaixo:
bits positivos

b7 b6 b5 b4 b3 b2 b1 b0

O valor deste unsigned char ser:


b727 + b626 + b525 + b424 + b323 + b222 + b121 + b020

5/4/2010 15:44 11
Todos os bits bn-1, bn-2, ..., b1, b0 so usados para armazenar os dgitos da representao
binria do nmero. No existe um mecanismo para representar o sinal do nmero. Portanto
o tipo unsigned ser sempre um nmero inteiro positivo ou zero.
O menor valor possvel se dar quando todos os n bits so 0, formando o nmero 0. O
maior valor possvel ser obtido quando todos os n bits so 1, gerando o nmero 2n 1
(verifique isso com o algoritmo de multiplicaes sucessivas).
Para o tipo unsigned char, que usa 8 bits, isto significa que o seu menor valor possvel
0 e o maior 28 1, ou seja, 255.
signed
J as variveis inteiras de tipo signed empregam uma estratgia diferente. Em uma palavra
de n bits (bn-1bn-2...b1b0), somente os bits bn-2...b1b0 armazenam os dgitos da representao
binria do nmero.
A soluo mais simples seria o bit bn-1 indicar o sinal do nmero (por exemplo, 0 para
positivo e 1 para negativo). Esse bit tambm conhecido como o bit de sinal, s. Numa das
possveis convenes para nmeros negativos, usada nos computadores atuais, o bit bn-1
acrescenta um deslocamento negativo de 2n-1 unidades ao valor formado pelos bits bn-2...b0.
A estrutura de um signed char est ilustrada abaixo:
bits positivos

s b6 b5 b4 b3 b2 b1 b0

deslocamento
negativo
O valor deste signed char ser (para n = 8):
[ 28-1s ] + b626 + b525 + b424 + b323 + b222 + b121 + b020
Quando o bit s for zero (conveno para nmeros positivos), o valor se reduz a
b626 + b525 + b424 + b323 + b222 + b121 + b020
Portanto, o maior valor positivo possvel nessa representao 28-1 1 = 127, e o menor
valor 0. Quando o bit s for um (conveno para nmeros negativos), o valor se reduz a
27 + b626 + b525 + b424 + b323 + b222 + b121 + b020
Teremos o maior valor quando os bits b6,...,b1, b0 forem todos 1. Nesse caso, o valor da
parte positiva seria 27 1, e o valor total ficaria em 27 + (27 1) = 1. O menor valor se
dar quando todos os bits da parte positiva forem 0, resultando num valor final de 27 + 0
= 27 = 128. Repare como os valores positivos e negativos que a conveno acomoda
nunca se misturam. Resumindo, para o tipo signed char (8 bits), o menor valor possvel
-128 e o maior 127.
Em geral, com n bits, teremos um valor mximo de 2n-1 1 e um valor mnimo de 2n-1.
Mais adiante justificaremos porque os computadores atuais usam essa representao.
Exemplos:
Caso 1: Representar, usando 8 bits, o nmero 66 como signed char e como unsigned
char. Em binrio, este nmero : 10000102.

5/4/2010 15:44 12
Unsigned char Signed char
b7 b6 b5 b4 b3 b2 b1 b0 s b6 b5 b4 b3 b2 b1 b0
0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0

Neste caso, a representao binria igual tanto para signed como para unsigned int.

Caso 2: Representar o nmero 175 usando 8 bits. Em binrio: 101011112.


Unsigned char Signed char
b7 b6 b5 b4 b3 b2 b1 b0 s b6 b5 b4 b3 b2 b1 b0
1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1

Impossvel!
A representao como unsigned char trivial. Mas para signed char ocorre um
problema. Os 7 bits b6b5b4b3b2b1b0 no so suficientes para armazenar os 8 bits necessrios
para representar 175. O bit b7 ser equivocadamente interpretado como o bit s
(deslocamento negativo). Ao invs de 175, o valor resultante ser: 2n-11 + 026 + 125 +
024 + 123 + 122 + 121 + 120 = -81. Isto explica alguns dos erros de converso que
podem ocorrer quando atribumos o valor de uma varivel de tipo unsigned para uma
varivel de tipo signed.
Caso 3: Representar o nmero -90 com 8 bits. Como o nmero negativo, precisamos
aplicar o deslocamento negativo 2n-1, que para o caso de signed char ser 27, e
descobrir quanto somar a 27 at obter 90. Neste caso: 90 = 27 + 38. A representao
binria de 38 1001102.
Unsigned char Signed char
b7 b6 b5 b4 b3 b2 b1 b0 s b6 b5 b4 b3 b2 b1 b0
1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0

Impossvel!
A representao como signed char fcil, basta atribuir 1 para o bit s de deslocamento
negativo e preencher os bits positivos para formar o nmero 38 (1001102). Repare que os
bits b6 at b0 no representam +90, que o valor absoluto do nmero que queremos
representar, mas indicam o complemento de +90 para 128. Para unsigned char, a
representao impossvel pelo simples fato de no existir um mecanismo para informar
que o nmero negativo. Se insistirmos em utilizar a mesma seqncia de bits que usamos
para o caso signed char, ento os bits sero interpretados de forma diferente da desejada:
127 + 026 + 125 + 024 + 023 + 122 + 121 + 020 = 166. Isto explica alguns dos erros de
converso que podem ocorrer quando atribumos o valor de uma varivel de tipo signed
para uma varivel de tipo unsigned.

5/4/2010 15:44 13

Você também pode gostar