Escolar Documentos
Profissional Documentos
Cultura Documentos
23 2
Pegar os bits (0 ou 1)
1 11 2 desde o último
1 5 2 quociente (1) até o
1 2 2 primeiro resto.
0 1
-3 10011 00101
10011
Soma 11000 Que número é esse?
5 – 3 = – 8 ???
© ELFS 42
Representação de Números Inteiros
• Outra representação, normalmente usada pelos
computadores, é a complemento-de-2. Para números
positivos, a representação é idêntica à da forma
sinal-magnitude. Para os números negativos, a
representação se dá em dois passos:
• Inverter os bits da representação do número positivo;
• Somar 1 ao resultado.
Exemplo:
Decimal Binário 00101 Notar que o último "vai
11101 um" não é usado, pois a
+5 00101 Soma 00010 representação usa apenas
+3 00011 5 bits.
−3 11100
1 Notar que esse número
11101 corresponde a +2!
© ELFS 43
Representação de Números Inteiros
• Na representação complemento-de-2, o que acontece com
o zero?
Decimal Binário
+0 00000 De novo, o último "vai um"
−0 11111 não é usado, pois a
1 representação usa apenas
00000 5 bits.
© ELFS 44
• Observar que na representação complemento-de-2 existe
sempre um valor negativo a mais.
• Por exemplo, com n = 4 bits:
0000 0001 0010 0011 0100 0101 0110 0111
0 +1 +2 +3 +4 +5 +6 +7
1000 1001 1010 1011 1100 1101 1110 1111
-8 -7 -6 -5 -4 -3 -2 -1
x = pow(2,31)-1;
printf("x = %d\n",x); Esse primeiro printf vai mostrar o que?
x = x + 1;
printf("x = %d\n",x); E esse outro printf vai mostrar o que?
return 0;
}
© ELFS 47
Representação de Números de Ponto Flutuante
• Números de ponto flutuante são os números reais que
podem ser representados no computador.
• Nem todos os números reais podem ser representados no
computador. Por que?
• A representação de números de ponto flutuante segue
padrões internacionais (IEEE-754 e IEC-559).
• A representação de ponto flutuante tem três partes: o
sinal, a mantissa e o expoente.
• Exemplo: x = 567.89 = 5.6789 x 102
• No caso de computadores (representação binária), a
mantissa é representada na forma normalizada, ou seja,
na forma 1.f, onde f corresponde aos demais bits.
• Ou seja, o primeiro bit da mantissa é sempre 1.
© ELFS 48
Representação de Números de Ponto Flutuante
• Exemplos:
Decimal Binário Binário normalizado
Expoente
+13.25 1101.01 1.10101 x 23
Mantissa
• x = 1.10101 x 23
• mantissa = 10101
• expoente = 3 + 127 = (130)10 = (10000010)2
10111110100000000000000000000000
© ELFS 51
Uma questão importante:
© ELFS 52
Representação de Dados Não-Numéricos
FEG
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
12.5
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
81
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
FEG
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
12.5
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
81
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
FEG
12.5
81
• Resumindo:
Tamanho
Tipo Valor
(bytes)
char 1 Um caractere.
int 4 Um número inteiro.
float 4 Um número de ponto flutuante (SP).
double 8 Um número de ponto flutuante (DP).
Operador Operação
+ soma
- subtração
* multiplicação
/ divisão
% resto da divisão
© ELFS 60
Atenção!
int a = 10, b = 3;
© ELFS 63
Endereços de variáveis
• Uma variável representa um nome simbólico para uma
posição de memória.
• Cada posição de memória de um computador possui um
endereço. Logo, o endereço de uma variável é o
endereço da posição de memória representada pela
variável.
int x = 3;
printf("Valor = %d - Endereco = %p",x,&x);
y 0022FF74 3 x
0022FF70 0022FF74
• Diz-se: y é um ponteiro para x ou y aponta para x.
© ELFS 65
Nível mais alto de abstração:
y 3 x
© ELFS 66
Sistema Hexadecimal
• O sistema hexadecimal (base 16) é o mais usado para
representar endereços de memória.
• Usado porque é compacto: consegue representar 1 byte
com apenas 2 dígitos! Ou seja, Hexa Decimal Binário
cada 4 bits são representados por 0 0 0000
1 1 0001
um único algarismo hexadecimal. 2 2 0010
© ELFS
(1 0100)2 = (14)16 F 15 1111
67
Sistema Hexadecimal
• As conversões entre as bases 16 e 10 devem ser feitas
da forma padrão.
• Da base 16 para a base 10: soma de potências da base.
(ABAFA)16 = (703226)10
Ax164 + Bx163 + Ax162 + Fx161 + Ax160 = 703226
© ELFS 68
Operadores de Incremento e Decremento
• Uma operação muito comum em programas de
computador é aumentar de 1 o valor de uma variável.
• Para fazer isso, devemos:
• Somar 1 ao valor atual da variável;
• Armazenar o resultado na própria variável.
• Exemplo: x = x + 1;
• Como a operação incremento de 1 é muito comum, na
linguagem C tem-se um operador especial: ++.
• Assim, em vez de: x = x + 1, podemos escrever: x++.
• Da mesma forma, para a operação decremento de 1, em
vez de: x = x - 1, podemos escrever: x--.
• Os operadores ++ e -- podem ser usados como prefixo
ou como sufixo do nome da variável.
© ELFS 69
Operadores de Incremento e Decremento
• Exemplos:
int a = 5, b = 3;
int c;
a++; a = 6
++b; b = 4
c = a++ + b; c = 6 + 4 = 10 a = 7
c = ++a + b; c = 8 + 4 = 12 a = 8
© ELFS 70
Operações combinadas com a atribuição
• Na linguagem C, uma operação de atribuição da forma:
• Exemplos:
x = x + 1; x += 1;
x++; x += 1;
x = x + (a + b); x += (a + b);
x = x – (a + b); x -= (a + b);
x = x * (a – b); x *= (a – b);
x = x / (x + 1); x /= (x + 1);
int main()
{ Estas instruções serão
int a = 1; b = 2; c = 3;
float delta,x1,x2; executadas somente se
delta = b*b - 4*a*c; delta >= 0.
if (delta >= 0)
{
x1 = (-b + sqrt(delta))/(2*a);
x2 = (-b – sqrt(delta))/(2*a);
printf("Raizes reais: x1 = %f e x2 = %f\n",x1,x2);
}
return 0;
} Existe, portanto, uma condição para que
estas instruções sejam executadas. Se a
condição for falsa, as instruções não serão
executadas.
© ELFS 74
Processamento condicional
• Todo comando if requer uma condição. O valor de uma
condição pode ser verdadeiro (V) ou falso (F).
if (condição)
{
instruções a serem executadas se a condição for verdadeira;
}
maisnova = 1;
if (idade2 < idade1)
{
maisnova = 2;
}
int fator = 3;
if (fator = 1)
{ Exibe:
printf("Fator unitario\n"); Fator unitario
} fator = 1
printf("fator = %d\n", fator);
int fator = 3;
if (fator = 0)
{ E nesse caso?
printf("Fator nulo\n");
}
printf("fator = %d\n", fator);
© ELFS 78
Comando if-else
• Todo comando if requer uma condição, que pode ser
verdadeira ou falsa.
• Se a condição for verdadeira, um bloco de instruções
(delimitado por { }) será executado.
• Quando existe um bloco de instruções a ser executado, se
o valor da condição for falso, utiliza-se o comando if-else.
if (delta >=0) Se o bloco contém mais
{
x1 = (-b + sqrt(delta))/(2*a);
de 1 instrução as chaves
x2 = (-b – sqrt(delta))/(2*a); { } são obrigatórias.
printf("Raizes reais: %f e %f", x1,x2);
}
else
{
printf("Nao existem raizes reais.");
}
Se o bloco contém apenas 1 instrução as chaves { } são opcionais,
mas é uma boa prática de programação mante-las.
© ELFS 79
Comando if-else
• Um bloco de instruções pode conter qualquer instrução,
inclusive um comando if ou um comando if-else.
if (delta >=0)
{
x1 = (-b + sqrt(delta))/(2*a);
if (delta == 0) Observar que as
{ instruções que fazem
x2 = x1; parte de um bloco devem
} estar recuadas para a
else direita em relação às
{ chaves { }.
x2 = (-b – sqrt(delta))/(2*a);
}
printf("Raizes reais: %f e %f", x1,x2);
}
else
{
printf("Nao existem raizes reais.");
}
© ELFS 80
A importância dos recuos
if (delta >=0)
{
x1 = (-b + sqrt(delta))/(2*a); Que tal escrever o
if (delta == 0) programa dessa forma?
{
x2 = x1; Fica mais fácil ou mais
} difícil identificar qual é a
else abre-chaves que
{ corresponde a uma
x2 = (-b – sqrt(delta))/(2*a);
fecha-chaves?
}
printf("Raizes reais: %f e %f", x1,x2);
} Escrever o programa com
else recuos não custa nada e
{ o programa fica mais
printf("Nao existem raizes reais."); legível.
}
© ELFS 82
O operador condicional
• O operador condicional da linguagem C tem a seguinte
sintaxe:
(condição)?
resultado-se-condição-verdadeira Tudo pode ser escrito
: numa única linha.
resultado-se-condição-falsa
© ELFS 83
Leitura de dados
• A leitura de dados é uma outra forma de atribuir valores
a variáveis. Na linguagem C, usa-se a função scanf() para
a leitura de dados.
• Assim como na função printf(), a função scanf() pode ter
vários parâmetros, sendo o primeiro um string.
• No caso da função scanf(), este string deve conter
apenas tags, separadas por espaços em branco.
• Os demais parâmetros da função scanf() devem ser
endereços de variáveis.
• O que acontece quando o computador executa uma
instrução de leitura de dados?
• Exemplo:
scanf("%f", &c);
© ELFS 84
Leitura de dados
scanf("%f", &c);
© ELFS 87
Escrevendo resultados
• Exemplo:
printf("Valor de y = %f,\npara n = %d",y,(a+b));
printf("Valor de y = %f,\n",y);
printf("para n = %d",(a+b));
© ELFS 88