Академический Документы
Профессиональный Документы
Культура Документы
LINGUAGEM C
Baseado no PIC18F4520
ARQUIVO 5 OPERADORES
1
SUMRIO ARQUIVO 5
Operadores de ponteiro
Operadores
Operadores
Operador cast
Operadores
Operadores de
de atribuio
atribuio
Tipos
Tipos de
de dados
dados em
em uma
uma expresso
expresso Operador sizeof
Valor
Valor em
em ponto
ponto flutuante
flutuante
Operador vrgula
Operadores
Operadores aritmticos
aritmticos
Abreviao de
Operadores
Operadores relacionais
relacionais
expresses
Operadores
Operadores lgicos
lgicos
Operadores
Operadores bit
bit a
a bit
bit
Operador
Operador ?
?
Exerccios
Exerccios
OBJETIVOS
OPERADORES
OPERADOR DE ATRIBUIO
ATRIBUIES MLTIPLAS
unsigned char x;
unsigned char y;
unsigned int z;
x = 150;
y = 200;
z = x + y;
10
11
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
x = d0.d1.d2.d3....d23 x 2E
O expoente E pode ocupar faixa de valores de 126 a 127.
Os bits d0.d1.d2.d3....d23 representam a parte fracionria do valor e o smbolo
representa o bit de sinal do valor, que ser nvel lgico '0' para valores positivos
e nvel lgico '1' para valores negativos.
A quantidade de bits utilizada na representao de valores em ponto flutuante
no MPLAB C18 de 32 bits.
Microcontroladores PIC18F4520 com Linguagem C
12
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
Sinal
Expoente
e7,e6,e5,e4,e3,e2,e1,e0
Parte fracionria
d0.d1.d2.d3....d23
O bit d0 no fisicamente armazenado, uma vez que ele pode ser obtido do
valor do expoente.
Se o expoente for 0, d0 ser nvel logico '0'. Qualquer outro valor de expoente
far com que d0 seja nvel logico '1'.
13
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
if d1 ... d23 = 0
NaN if d1 ... d23 0
14
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
Sendo assim, o valor 3,59375 ser representado no MPLAB C18 pelo valor
40660000h, que convertido em binrio torna-se valor
Expoente
10000000
Parte fracionria
1100110 00000000 00000000
Sinal positivo: 02
Parte fracionria: (1,d1d2d3....d23)2 = 1x20,(2-1xd1 + 2-2xd2 + 2-3xd3 +... 2-22xd23)
= 1,79687510
1,796875 x 21 = +3,59375
15
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
16
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
O programa-fonte main_07.c cria na memria RAM uma seo de dados com as
variveis do tipo float f1 e f2. Isso foi feito por meio da diretiva de compilao
#pragma que cria uma seo de dados chamada my_section na memria RAM,
iniciada no endereo 0x100.
Como uma varivel float ocupa quatro localidades de memria devido ao fato de
ser representada por 32 bits, as variveis f1 e f2 ocuparo, respectivamente, os
endereos 100h:103h e 104h:107h.
17
REPRESENTAO DE VALORES
EM PONTO FLUTUANTE
18
OPERADORES ARITMTICOS
Operador
Ao
Subtrao
Adio
Multiplicao
Diviso
Resto da diviso
--
Decremento
++
Incremento
19
OPERADORES ARITMTICOS
20
OPERADORES ARITMTICOS
unsigned char a = 100;
unsigned char x = 180;
unsigned char y = 12;
unsigned int z = 0;
z = (x + y) * (41 + a);
21
OPERADORES ARITMTICOS
22
OPERADORES ARITMTICOS
O programa-fonte main_08.c mostra o resultado obtido pelos operadores / e %.
/*********************************************************************
Nome do arquivo: main_08.c
Data: 23 de novembro de 2008
Versao:
1.0
Editor:
MPLAB IDE: v8.20a
Autor:Wagner Zanco
*********************************************************************/
#include <stdio.h>
//diretiva de compilao
//*******************************************************************
void main(void)
//funo main
{
unsigned char x;
//declarao de varivel no inicializada
unsigned char y;
//declarao de varivel no inicializada
unsigned int z;
//declarao de varivel no inicializada
unsigned int w;
//declarao de varivel no inicializada
x = 37;
//atribui a x o valor 37
y = 6;
//atribui a y o valor 6
z = x / y;
//z = x / y
w = x%y;
//w recebe o resto da diviso x/y
printf("37/6 = %d",z);
//envia para a USART o resultado da diviso x/y
printf(", e o resto da divisao = %d\n",w);
//envia para a USART o resto da diviso x/y
while (1);
//loop infinito
}//***************************************************************************
23
OPERADORES ARITMTICOS
String enviada para a UART1 pelo programa-fonte main_8.c.
24
OPERADORES ARITMTICOS
-36/4 = -9. No entanto, o valor 36, do tipo char, ser convertido pelo MPLAB
C18 em um tipo unsigned char antes de efetuar a diviso por 4.
O clculo efetuado ser 220/4 = 55. Este o valor retornado pela funo.
O valor 110111002 corresponde a valores diferentes nos tipos de dados char e
unsigned char.
Tipo char: 3610 => 110111002
Tipo unsigned char: 22010 => 110111002
Microcontroladores PIC18F4520 com Linguagem C
25
OPERADORES DE INCREMENTO
E DECREMENTO
26
OPERADORES DE INCREMENTO
E
DECREMENTO
Quando os operadores ++ e -- so utilizados em uma expresso eles podem
provocar aes diferentes, dependendo de como eles so utilizados. Vejamos a
expresso a seguir.
x = 20;
y = ++x;
A varivel y recebe o valor 21, uma vez que a varivel x foi incrementada aps
receber o valor 20. O resultado atribudo varivel y. Tanto a varivel x quanto
a varivel y recebero o valor 21. No exemplo a seguir o resultado ser
diferente.
x = 20;
y = x++;
27
AVALIAO DE OPERADORES
EM EXPRESSES
28
AVALIAO DE OPERADORES
ARITMTICOS EM EXPRESSES
A precedncia dos operadores aritmticos a seguinte:
Mais alta++ -- (operador unrio)
*
Mais baixa + Deve-se sempre ser utilizado parnteses nas expresses para tornar clara a
ordem de avaliao em vez de deixar essa tarefa a cargo do compilador.
Parnteses em expresses pode contribuir para evitar problemas de ordem de
avaliao quando esse poderoso recurso for utilizado em suas aplicaes.
O problema de ordem de avaliao nas expresses pode produzir um resultado
no esperado, podendo se agravar quando os operadores aritmticos
trabalharem em conjunto com os outros tipos de operadores, como os
operadores relacionais e lgicos.
Microcontroladores PIC18F4520 com Linguagem C
29
OPERADORES RELACIONAIS
Operador
Ao
>
Maior que
>=
Maior ou igual a
<
Menor que
<=
Menor ou igual a
==
Igual a
!=
Diferente de
30
OPERADORES RELACIONAIS
Vejamos o exemplo a seguir.
//***********************************************************
int _compara(int x)
//funo _compara
{
if (x > 10) return 1; //se x > 10 retorna 1
else return 0;
//se x <=10 retorna 0
}//**********************************************************
31
>= <
Mais baixa
== !=
<=
32
FALSO E VERDADEIRO
33
OPERADORES LGICOS
Operador
&&
Ao
AND
||
OU
NOT
34
OPERADORES LGICOS
A Tabela abaixo mostra como so avaliados os operadores lgicos &&, || e ! .
O operador && retorna 1 somente se ambas as expresses forem verdadeiras.
O operador || retorna 0 somente se ambas as expresses forem falsas.
O operador ! inverte o status da expresso, retornando 0 se ela for verdadeira
e 1 se for falsa.
Expresso 1
Expresso 2
&&
||
!Expresso 1
falsa
falsa
falsa
verdadeira
verdadeira
falsa
verdadeira
Verdadeira
35
OPERADORES LGICOS
Os operadores lgicos so utilizados com muita frequncia em conjunto com os
operadores relacionais em comandos de controle. Vejamos o exemplo a seguir.
//*******************************************************************
int valor_int(int x)
//funo valor_int
{
if ((x > 10) || (x < 5)) return 0;
//se x > 10 ou x < 5 retorna 0
else return 1;
//se 5 x 10 retorna 1
}//*******************************************************************
36
Mais alta!
>
>= <
<=
== !=
&&
Mais baixa
||
37
Esse grupo de operadores foi includo na linguagem C para que ela pudesse
substituir a Linguagem Assembly em muitas aplicaes impossveis de
desenvolver em uma linguagem de alto nvel.
Ao
&
AND
OR
XOR
Complemento de 1
>>
Deslocamento direita
<<
Deslocamento esquerda
38
&
~A
39
&
~A
A funo lgica AND s resulta em nvel lgico '1' se ambos os bits forem '1'.
A funo lgica OR resulta em nvel lgico '0' quando ambos os bits so '0'.
A funo lgica XOR (ou-exclusivo) resulta em nvel lgico '1' quando os bits
tm nveis lgicos diferentes e resulta em nvel lgico '0' quando os bits forem
iguais.
40
FUNO AND
Vejamos o exemplo a seguir.
unsigned char x = 0b00010101; //declarao de varivel inicializada
unsigned char y = 0b11110000; //declarao de varivel inicializada
unsigned char z;
//declarao de varivel no inicializada
z = x & y;
//z = x and y
41
FUNO XOR
A Podemos utilizar a funo lgica XOR para comparar dois valores.
//*******************************************************************
int compara_int(int x)
//funo compara_int
{
int y;
//declarao de varivel local no inicializada
y = x ^ 10; //se x = 10, y = 0
return y;
//retorna 0 se x = 10
}//*******************************************************************
42
FUNO NOT
//*******************************************************************
int recupera_modulo(int x) //funo recupera_modulo
{
x = (~x) + 1;
//recupera mdulo de x
return x;
//retorna mdulo de x
}//*******************************************************************
Suponha que a funo receba como parmetro o valor 25. Nesse caso, ela
retorna o valor +25.
43
FUNO NOT
Quando um valor negativo complementado, o bit mais significativo que indica
o sinal, recebido como '1', tambm complementado tornando-se '0'.
Isso far com que seja invertido o status do sinal, ou seja, o valor passa a ser
positivo.
Adicionando o valor 1 ao complemento, resgatado o mdulo do resultado.
11111111 111001112
00000000 000110002
+12
00000000 000110012
44
FUNO OR
Os bits sero introduzidos nos 4 bits mais significativos sem que sejam
alterados os 4 bits menos significativos do valor armazenado em x. Vejamos
como fazer isso.
//*******************************************************************
char introd_nibble(char x)
//funo introd_nibble
{
x = (x & 0x0f) | 0b10110000;
/*mascara nibble superior e introduz o nibble 1011
na parte alta de x */
return x;
//retorna x
//*******************************************************************
45
FUNO OR
//*******************************************************************
char introd_nibble(char x)
//funo introd_nibble
{
x = (x & 0x0f) | 0b10110000;
/*mascara nibble superior e introduz o nibble 1011
na parte alta de x */
return x;
//retorna x
//*******************************************************************
O nibble inferior do parmetro recebido no ser alterado, uma vez que eles
sero somados com '0's.
Essa funo pode seu til em aplicaes em que seja atribuda uma funo
diferente a cada bit armazenado em uma varivel.
Microcontroladores PIC18F4520 com Linguagem C
46
DETECTAR SINAL
//*******************************************************************
int verifica_sinal(int x) //funo verifica_sinal
{
if (x & 0x8000) return 1; //retorna 1 se x negativo
else return 0;
//retorna 0 se x positivo
}//*******************************************************************
47
48
49
OPERADOR ?
No exemplo, a varivel y recebe o valor 50. A expresso x < 5 falsa, uma vez
que o valor 10 foi atribudo varivel x no comando anterior.
Exp3 assume o valor da expresso, que ir atribuir o valor 50 varivel y.
50
Ele pode ser armazenado em uma varivel, desde que ela seja declarada
especialmente para tal objetivo.
Uma varivel de ponteiro deve ser declarada sendo do mesmo tipo de varivel
apontado por ela.
Uma varivel de ponteiro criada para armazenar o endereo de uma varivel do
tipo int deve ser declarada como int. Veja a seguir como declarar uma varivel
de ponteiro inteira.
int *p;
51
/*********************************************************************
Nome do arquivo:
main_10.c
Data:
28 de novembro de 2008
Versao:
1.0
Editor:
MPLAB IDE: v8.20a
Autor:
Wagner Zanco
*********************************************************************/
#include <stdio.h>
//diretiva de compilao
//*******************************************************************
void main(void)
//funo main
{
int *p;
//declarao de varivel de ponteiro
int contador;
//declarao de varivel no inicializada
int x;
//declarao de varivel no inicializada
contador = 100;
//contador recebe o valor 100
p = &contador;
//p recebe endereo da varivel contador
x = *p;
//x recebe o contedo do endereo apontado por p
printf("O endereco da variavel contador eh = %#x\n",p); //envia para a UART o endereo de contador
printf("O conteudo da variavel contador eh = %d\n",x); //envia para a UART o contedo de contador
while (1);
//loop infinito
}//*******************************************************************
52
53
OPERADOR CAST
char x;
//declarao de varivel no inicializada
int y;
//declarao de varivel no inicializada
x = -10;
//x recebe o valor -10
y = (int) x; //y recebe o contedo de x convertido para inteiro
printf("O conteudo da variavel y eh = %d\n",y);
//envia para a UART o contedo da varivel y
54
OPERADOR CAST
Vejamos agora o exemplo a seguir. A expresso divide um valor char por 2 (x/2)e o converte em float utilizando o
operador cast. Nesse caso, o resultado da expresso que ser armazenado na varivel z o valor 4,5. Veja que o
resultado convertido em float inclui a parte fracionria do resultado.
float mult(void)
{
char x=9;
float z=0;
z=(float)x/2;
return z;
}
//funo mult
//declarao de varivel inicalizada
//declarao de varivel inicalizada
//z=x/2
//retorna o resultado da diviso
55
OPERADOR CAST
56
OPERADOR SIZEOF
int x;
//declarao de varivel no inicializada
int y;
//declarao de varivel no inicializada
y = sizeof x;
//y recebe o tamanho de x, em bytes
printf("O tamanho de y eh = %d\n",y);
//envia para a USART o tamanho de x
57
OPERADOR VRGULA
int x;
int y;
58
ABREVIAO DE EXPRESSES
Essa abreviao pode ser feita com todos os operadores binrios que
necessitam de dois operandos.
59
ABREVIAO DE EXPRESSES
Comando
Comando abreviado
x = x + exp
x += exp
x = x exp
x -= exp
x = x * exp
x *= exp
x = x / exp
x /= exp
x = x % exp
x %= exp
x = x & exp
x &= exp
x = x | exp
x |= exp
x = x ^ exp
x ^= exp
x = x << exp
x <<= exp
x = x >> exp
x >>= exp
60
ABREVIAO DE EXPRESSES
Vejamos a seguir a ordem de precedncia dos operadores apresentados.
Mais alta
Menor
()
!
sizeof
*
+
<<
<
==
&
^
|
&&
||
?
=
,
[]
~
->
++ --
/
>>
<=
!=
%
>
>=
+=
-=
*=
(tipo)
/=
61
&
EXERCCIOS
8.
9.
10. Quais os valores retornados por uma expresso que contm operadores relacionais?
62
EXERCCIOS
11. Descreva a ordem de precedncia dos operadores relacionais.
12. Quais so os operadores lgicos?
13. Quais os valores retornados por uma expresso que contm operadores
lgicos?
14. Qual a ordem de precedncia dos operadores lgicos?
15. Quais so os operadores bit a bit.
16. Qual o valor armazenado na varivel z aps a execuo da frao de
cdigo a seguir?
unsigned char x = 0b00011001;
unsigned char z;
63
EXERCCIOS
17. Que operador bit a bit podemos utilizar para verificar se dois valores so
iguais? D um exemplo.
18. Qual o procedimento para se obter o complemento de dois de um valor
negativo?
19. Monte um algoritmo para introduzir os bits 10102 no nibble mais
significativo da varivel do tipo char x.
20. Qual bit determina se um valor sinalizado negativo em C?
21. Qual a funo dos operadores << e >>?
22. Monte um algoritmo que efetue o produto do contedo da varivel x=4 por
5 utilizando um dos operadores de deslocamento.
23. Descreva o funcionamento do operador ternrio ?. D um exemplo de sua
utilizao.
24. Qual o operador utilizado na declarao de uma varivel do tipo ponteiro?
Explique sua funo.
25. Que operador devemos utilizar para atribuir a uma varivel de ponteiro o
contedo de outra varivel?
64
EXERCCIOS
26. Qual a funo do operador cast?
27. Qual a funo do operador sizeof?
28. D um exemplo de utilizao do operador vrgula.
29. Como podemos abreviar uma expresso? D exemplos.
30. Qual a ordem de precedncia dos operadores lgicos, relacionais bit a bit
e dos operadores especiais?
65