Вы находитесь на странице: 1из 65

MICROCONTROLADORES com

LINGUAGEM C
Baseado no PIC18F4520

ARQUIVO 5 OPERADORES
1

SOBRE ESTE MATERIAL


Este material para uso individual. Todos os direitos reservados. Proibida
a distribuio total ou parcial deste material, por qualquer meio ou
processo, sem a expressa autorizao do autor. Essas proibies aplicamse tambm s caractersticas grficas da obra e sua editorao.
A violao dos direitos autorais punvel como crime (art. 184 e
pargrafos, do Cdigo Penal, cf. Lei no 6.895, de 17.12.80) com pena de
priso e multa, conjuntamente com busca e apreenso e indenizaes
diversas (artigos 102, 103 pargrafo nico, 104, 105, 106 e 107 itens 1, 2
e 3 da Lei no 9.610, de 19/06/98, Lei dos Direitos Autorais).
Certos materiais contidos neste arquivo foram includos com a permisso
da Microchip Technology Incorporated. Nenhuma distribuio, reimpresso
ou reproduo do material citado pode ser feita sem o consentimento por
escrito da Microchip Technology Inc.

Microcontroladores PIC18F4520 com Linguagem C

Wagner2 da Silva Zanco

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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

OBJETIVOS

Classificar os operadores da Linguagem C quanto ao seu tipo.


Utilizar os operadores em expresses aritmticas e relacionais.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

OPERADORES

Um conjunto poderoso de operadores permite a execuo de clculos


matemticos comuns s linguagens de alto nvel, e tambm aqueles
dedicados s linguagens de baixo nvel.

Os operadores fazem da linguagem C uma das mais atraentes


linguagens de programao no que diz respeito clculos matemticos.

Os operadores esto divididos em vrios grupos. So eles:


Aritmticos
Lgicos
Relacionais
Bit a bit
Operadores especiais.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

OPERADOR DE ATRIBUIO

O operador de atribuio talvez seja o mais utilizado de todos eles e


tem, em sua essncia, a funo de atribuir a uma varivel o resultado de
uma expresso.
nome_da_varivel = expresso

Expresso - Pode ser uma simples constante ou uma expresso


matemtica to complexa quanto se possa imaginar.

nome_da_varivel - Pode ser o identificador atribudo varivel quando


ela for declarada, ou um ponteiro para o endereo onde ela se encontra
na memria.
unsigned char x;
//declarao de varivel
unsigned char y;
//declarao de
varivel
unsigned int z; //declarao de varivel
x = 15;
//x=15
y = 20;
//y=20
z = x + y;
//z=x+y
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

ATRIBUIES MLTIPLAS

A linguagem C permite que seja atribudo o mesmo valor vrias


variveis no mesmo comando. Vejamos o exemplo a seguir.
x = y = z = 10;

O comando acima atribuir o valor 10 s variveis x, y e z. Essa forma


de atribuio muito utilizada em aplicaes profissionais.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

TIPOS DE DADOS EM UMA


EXPRESSO

Ao ser executado um comando de atribuio a varivel recebe o


resultado da expresso.

O tipo de dado resultado de expresso deve ser do mesmo tipo de


dado suportado pela varivel.

Em caso contrrio, o compilador provavelmente no emitir nenhum


aviso, mas o valor atribudo varivel pode no ser o esperado.

Isso normalmente acontece quando misturamos variveis de diferentes


tipos na mesma expresso. Vejamos o exemplo a seguir.

unsigned char x;
unsigned char y;
unsigned int z;
x = 150;
y = 200;
z = x + y;

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

TIPOS DE DADOS EM UMA


EXPRESSO
unsigned char x;
unsigned char y;
unsigned int z;
x = 150;
y = 200;
z = x + y;

O valor resultante da expresso x + y 350, porm o valor armazenado na


varivel z ser o 94.

Isso acontece porque as variveis x e y so do tipo char. Sendo assim,


quando elas forem somadas o compilador atribuir ao resultado um tipo char
que possui 8 bits de tamanho.

No entanto, o valor 350 representado por 9 bits. O MPLAB C18, ao


armazenar o resultado da expresso na varivel z, desprezar o bit mais
significativo do resultado.
x + y = 150 + 200 = 350 (1010111102)
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

TIPOS DE DADOS EM UMA


EXPRESSO
Ao ser desprezado o bit mais significativo do resultado

ele passa a ser

010111102, que equivale ao valor 94 em decimal.

O truncamento ocorrido no resultado da expresso x + y = 350 , na verdade,


uma divergncia entre o C ANSI e o MPLAB C18. O C ANSI determina que toda
aritmtica deva ser executada com uma preciso mnima do tipo int.
O MPLAB C18 adota como default em clculos matemticos o mesmo tipo de
dado do maior operando, mesmo se o tamanho dos operandos for menor que o
tipo int1.
Foi o que aconteceu no exemplo anterior. As variveis x e y so do tipo char,
por isso foi atribudo ao resultado o tipo char.
Nota 1: possvel eliminar essa divergncia habilitando a
opo Enable Integer Promotion na guia "MPLAB C18" do
menu Project/Biuld Options.../Project.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

10

TIPOS DE DADOS EM UMA


EXPRESSO
unsigned int in = 800;
unsigned char ch = 125;
float f = 465.85;
ch = in;
in = f;
f = ch;

No exemplo acima, a varivel ch do tipo char (8 bits), a varivel in do tipo


int (16 bits) e a varivel f do tipo float (32 bits). O comando ch = in; atribui
varivel ch o contedo da varivel in.

Nessa converso de tipos os 8 bits mais significativos da varivel in sero


perdidos. Sendo assim, a varivel ch receber o valor 32, que nada mais do
que os 8 bits menos significativos do valor 800, armazenado na varivel in.

O comando in = f; atribui a parte inteira da varivel f varivel in, o valor 465.


J o comando f = ch; atribui varivel f o valor de ch que ser convertido em
ponto flutuante antes de ser carregado na varivel f.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

11

REPRESENTAO DE VALORES
EM PONTO FLUTUANTE

Um valor em ponto flutuante. representado no MPLAB C18 pelo padro


IEEE 754, publicado em 1985, o qual contm normas a serem seguidas por
fabricantes de computadores, softwares e compiladores para a representao
de valores em ponto flutuante.

Um valor x, em ponto flutuante, ser representado na memria da seguinte


forma:

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

Wagner da Silva Zanco

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'.

Com isso, pode-se efetuar uma converso com 24 bits de preciso


armazenando apenas os 23 bits menos significativos da parte fracionria.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

13

REPRESENTAO DE VALORES
EM PONTO FLUTUANTE

A tabela abaixo mostra a forma de representao de ponto flutuante em


formato simples.
Expoente
Nmero representado
(00000000)2 = (00)16 = (0)10

(0.d1d2d3 ... d23)2 2-126

(00000001)2 = (01)16 = (1)10

(1. d1d2d3 ... d23)2 2-126

(00000010)2 = (02)16 = (2)10


(00000011)2 = (03)16 = (3)10

(1. d1d2d3 ... d23)2 2-125


(1. d1d2d3 ... d23)2 2-124

(01111110)2 = (7E)16 = (126)10

(1. d1d2d3 ... d23)2 2-1

(01111111)2 = (7F)16 = (127)10


(10000000)2 = (80)16 = (128)10

(1. d1d2d3 ... d23)2 20

(11111100)2 = (FC)16 = (252)10

(1. d1d2d3 ... d23)2 2125

(11111101)2 = (FD)16 = (253)10

(1. d1d2d3 ... d23)2 2126

(11111110)2 = (FE)16 = (254)10

(1. d1d2d3 ... d23)2 2127

(11111111)2 = (FF)16 = (255)10

if d1 ... d23 = 0
NaN if d1 ... d23 0

(1. d1d2d3 ... d23)2 21

Nota: NaN - no um nmero


Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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

01000000 01100110 00000000 000000002.


A organizao dos bits que representaro o valor ficar da seguinte forma:
Sinal
0

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)

Expoente: 100000002 => 21

O valor representado em ponto flutuante pelo valor 40660000h o:

= 1,79687510

1,796875 x 21 = +3,59375

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

15

REPRESENTAO DE VALORES
EM PONTO FLUTUANTE

O programa-fonte main_07.c, mostrado a seguir, permite comprovar o que foi


apresentado nesse item sobre valores em ponto flutuante.
/*********************************************************************
Nome do arquivo:
main_07.c
Data:
20 de novembro de 2008
Versao:
1.0
Editor:
MPLAB IDE: v8.20a
Autor:
Wagner Zanco
*********************************************************************/
//delarao de varivel global com endereo fixo na memria RAM
#pragma udata my_section = 0x100 //cria seo de dados na memria RAM
float f1;
//declarao de varivel global no inicializada
float f2;
//declarao de varivel global no inicializada
#pragma udata
//termina seo de dados
//*******************************************************************
void main(void)
//funo main
{
f1 = 3.59375;
//atribui o valor 3,59375 varivel f1
f2 = 465.85; //atribui o valor 465,85 varivel f2
while (1);
//loop infinito
}//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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.

Para armazenar informaes com mais de 1 byte na memria o MPLAB C18


utiliza o formato Little Endian, no qual os bytes menos significativos sero
armazenados nos endereos menos significativos da memria.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

17

REPRESENTAO DE VALORES
EM PONTO FLUTUANTE

A Figura 7.1 mostra o contedo da memria RAM na faixa de endereos


utilizados pelas variveis f1 e f2 aps a simulao dessa aplicao. Para ter
acesso janela File Registers, clique no menu View\File Registers.

Veja que os valores armazenados nas variveis f1 e f2 so:


f1(100h:103h) = 40660000h
f2(104h:107h) = 43E8ECCDh

Para exercitar, mostre por meio de clculos que o valor 43E8ECCDh,


armazenado na varivel f2, representa o valor em ponto flutuante 465,85.
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

18

OPERADORES ARITMTICOS

Os operadores aritmticos so utilizados em operaes de soma,


subtrao, multiplicao, diviso, incremento e decremento.

A tabela a seguir mostra como esses operadores so representados nas


expresses que efetuam essas operaes matemticas.

Operador

Ao

Subtrao

Adio

Multiplicao

Diviso

Resto da diviso

--

Decremento

++

Incremento

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

19

OPERADORES ARITMTICOS

O MPLAB C18 adota para o resultado de um clculo matemtico o mesmo tipo


de dado do maior operando. Parnteses podem ser introduzidos para tornar
clara a ordem de avaliao da expresso. Vejamos o exemplo a seguir.
unsigned int x = 10;
unsigned int y = 12;
unsigned int z = 0;
x = (x + y) * (4 z);

Primeiramente, so executadas as expresses dentro dos parnteses e, em


seguida, os resultados so multiplicados. O resultado da expresso,
armazenado em x, ser o valor 88. Vejamos outro exemplo.

unsigned char a = 100;


unsigned char x = 180;
unsigned char y = 12;
unsigned int z = 0;
z = (x + y) * (41 + a);

O valor atribudo varivel z, resultado da expresso, ser 192. Vejamos como


ser a resoluo da expresso.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

20

OPERADORES ARITMTICOS
unsigned char a = 100;
unsigned char x = 180;
unsigned char y = 12;
unsigned int z = 0;
z = (x + y) * (41 + a);

O resultado da expresso no corresponde ao valor que ser armazenado na


varivel z, o valor 192.
fcil entender o que aconteceu, uma vez que todas as variveis envolvidas na
expresso so do tipo char.
O resultado da expresso do tipo char. O valor 192 corresponde aos 8 bits
menos significativos do valor 27.072, quando convertido em binrio.
O truncamento aconteceu mesmo sendo a varivel z do tipo int.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

21

OPERADORES ARITMTICOS

O operador de diviso /, quando aplicado a uma expresso, faz com que o


resto da diviso seja truncado. Vejamos o exemplo a seguir.

unsigned char x = 12;


unsigned char y = 5;
unsigned int z = 0;
z = x / y;

O resultado da expresso atribudo varivel z o valor 2. O resto da diviso


ser desprezado.
Para que o resto da diviso seja resgatado preciso utilizar o operador % em
vez do operador /.

A expresso 23 % 4 resulta no valor 3, o resto do resultado.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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
}//***************************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

23

OPERADORES ARITMTICOS
String enviada para a UART1 pelo programa-fonte main_8.c.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

24

OPERADORES ARITMTICOS

A funo _divisao(), mostrada a seguir, divide um valor do tipo char por um do


tipo unsigned char, sendo o resultado armazenado na varivel z, do tipo int.
//*******************************************************************
int _divisao(void) //funo _divisao
{
char x;
//declarao de varivel no inicializada
unsigned char y; //declarao de varivel no inicializada
int z;
//declarao de varivel no inicializada
x = -36;
//atribui a z o valor -36
y = 4; //atribui a y o valor 4
z = x / y;
//z = x / y
return z;
//retorna o valor de z
}//*******************************************************************

-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

Wagner da Silva Zanco

25

OPERADORES DE INCREMENTO
E DECREMENTO

Os operadores de incremento ++ e de decremento -- so utilizados


normalmente quando queremos, respectivamente, incrementar ou decrementar
o contedo de uma varivel.

Incrementar significa somar uma unidade ao contedo da varivel.


Um decremento ocorre quando subtrada uma unidade do valor armazenado
na varivel. Vejamos os exemplos a seguir.
x = x + 1; o mesmo que ++x; e o mesmo que x++;
x = x - 1; o mesmo que --x; e o mesmo que x--;

No primeiro caso, ao contedo da varivel x ser somada uma unidade e, no


segundo caso, do contedo da varivel x ser subtrada uma unidade.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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++;

Nesse caso, o valor armazenado na varivel x ser atribudo varivel y e, s


depois, a varivel x ser incrementada.
A varivel y receber o valor 20 e a varivel x o valor 21. O comando foi
executado de forma diferente porque o operador ++ foi introduzido aps a
varivel x. O mesmo raciocnio deve ser aplicado ao operador --.
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

27

AVALIAO DE OPERADORES
EM EXPRESSES

Quando os operadores aritmticos aparecem em uma expresso sem que os


parnteses sejam utilizados para tornar clara a ordem de avaliao, a linguagem
C utiliza um critrio de precedncia para avaliar as expresses. Vejamos o
exemplo a seguir.
X = 10 + y * 20 w / 5;

Devido ao critrio de precedncia, a avaliao da expresso anterior ser


efetuada da forma a seguir.
X = 10 + (y * 20) (w / 5);

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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

Wagner da Silva Zanco

29

OPERADORES RELACIONAIS

Os operadores relacionais so utilizados quando se deseja determinar a


relao existente entre dois valores numricos. A tabela abaixo mostra os
operadores relacionais.

muito frequente a utilizao de operadores relacionais com comandos de


controle de seleo, como os comandos if e switch.

Operador

Ao

>

Maior que

>=

Maior ou igual a

<

Menor que

<=

Menor ou igual a

==

Igual a

!=

Diferente de

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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
}//**********************************************************

A funo _compara() recebe como parmetro um valor numrico na varivel x.


O comando de controle de seleo if compara o valor recebido com o valor 10.
Se o valor armazenado na varivel x for maior que 10, a funo retorna o valor
1.
Em caso contrrio, ou seja, se o valor armazenado na varivel x for menor ou
igual a 10, a funo retorna o valor 0.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

31

PRECEDNCIA DOS OPERADORES


RELACIONAIS

Cuidado ao utilizar o operador relacional ==. No se pode confundi-lo com o


operador de atribuio =.

O operador == verifica a igualdade entre dois valores, enquanto o operador =


atribui um valor a uma varivel.

Da mesma forma como acontece com os operadores aritmticos, quando os


operadores relacionais aparecem em uma expresso sem que os parnteses
sejam utilizados para tornar clara a ordem de avaliao, a linguagem C utiliza
um critrio de precedncia para avaliar as expresses.

A precedncia dos operadores relacionais mostrada a seguir.


Mais alta>

>= <

Mais baixa

== !=

<=

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

32

FALSO E VERDADEIRO

importante observar que os operadores relacionais retornam apenas dois


valores quando so avaliados. Esses valores so falso e verdadeiro.

Verdadeiro qualquer valor diferente de zero, enquanto falso o valor zero.


Expresses nas quais so utilizados operadores relacionais retornam o valor 0
para falso e 1 para verdadeiro. Vejamos o exemplo a seguir.
x = 20;
y = (x >10);

O valor atribudo varivel y como resultado da expresso (x > 10) ser o


valor 1, uma vez que ela foi avaliada como verdadeira.

No exemplo a seguir o valor atribudo varivel y como resultado da expresso


ser 0 porque a expresso foi avaliada como falsa.
x = 10;
y = (x >10);

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

33

OPERADORES LGICOS

Os operadores lgicos executam as funes lgicas AND, OU e NOT entre


expresses.

Os operadores lgicos levam em considerao apenas se a expresso


verdadeira ou falsa e retornam, da mesma forma que os operadores relacionais,
1 para verdadeiro e 0 para falso.

A tabela abaixo mostra os operadores lgicos.

Operador
&&

Ao
AND

||

OU

NOT

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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
}//*******************************************************************

A funo valor_int() recebe um valor inteiro como parmetro na varivel x.


O comando de controle if avalia se o valor armazenado na varivel x est entre
5 e 10.
A funo retorna 1 se 5 x 10. Em caso contrrio, ela retorna 0. Embora os
operadores relacionais < e > tenham maior precedncia sobre o operador lgico
||, comum a utilizao de parnteses para tornar mais clara a ordem de
avaliao.
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

36

PRECEDNCIA DOS OPERADORES


LGICOS E RELACIONAIS

Embora os operadores relacionais < e > tenham maior precedncia sobre o


operador lgico ||, comum a utilizao de parnteses para tornar mais clara a
ordem de avaliao.

Vemos a seguir a ordem de precedncia dos operadores relacionais e lgicos.

Mais alta!
>

>= <

<=

== !=
&&
Mais baixa

||

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

37

OPERADORES BIT A BIT

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.

Os operadores bit a bit so OR, AND, XOR, Complemento de um,


Deslocamento esquerda e Deslocamento direita. A tabela abaixo mostra os
operadores bit a bit e as aes correspondentes.
Operador

Ao

&

AND

OR

XOR

Complemento de 1

>>

Deslocamento direita

<<

Deslocamento esquerda

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

38

OPERADORES BIT A BIT


Os operadores bit a bit efetuam funes lgicas e deslocamento, em nvel de
bit.
Essas operaes matemticas so muito importantes em diversas aplicaes,
principalmente aquelas utilizadas em acesso a dispositivos, como a
implementao de protocolos de comunicao serial, entre outras.
A tabela abaixo mostra como as funes lgicas so executadas entre os bits A
e B.
A

&

~A

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

39

OPERADORES BIT A BIT


A

&

~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.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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

A varivel z recebe o resultado da funo lgica AND efetuada entre os


contedos das variveis x e y.

Essa operao conhecida como mscara de bits e muito utilizada quando


desejamos aproveitar apenas alguns bits de uma informao armazenada em
uma varivel.
Os bits aproveitados da varivel x foram os quatro mais significativos. Os quatro
bits menos significativos da varivel x foram mascarados, ou seja, substitudos
por '0's.
x = 000101012
A varivel z recebeu os 4 bits mais
significativos da varivel x, enquanto os
y = 111100002
4 bits menos significativos foram
z = 000100002
substitudos por '0's.
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

41

FUNO XOR
A Podemos utilizar a funo lgica XOR para comparar dois valores.

Se os valores comparados forem iguais, o resultado da operao ser 0.


Vejamos o exemplo a seguir.

//*******************************************************************
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
}//*******************************************************************

A funo compara_int() recebe como parmetro um valor inteiro na varivel x.


O comando y = x ^ 10; atribui varivel y o valor 0 caso x = 10. Nesse caso, a
funo retorna o valor y = 0.
Se o parmetro recebido no for o valor 10, a funo retorna um valor qualquer
diferente de 0.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

42

FUNO NOT

Vejamos o exemplo a seguir. A funo recupera_modulo() recebe como


parmetro um valor inteiro negativo na varivel x e retorna o mdulo do
resultado.

//*******************************************************************
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.

A recuperao do mdulo consiste em efetuar o complemento de 1 do valor


recebido e adicionar uma unidade a esse complemento de 1.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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

-25 (valor recebido)


complemento de um
adiciona uma unidade
+25 (valor retornado)

Para que a funo recupera_modulo() funcione de forma correta preciso se


certificar de que o valor recebido como parmetro na varivel x seja negativo;
caso contrrio, o resultado no ser o esperado.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

44

FUNO OR

A funo lgica OR pode ser utilizada quando se deseja introduzir


determinados bits em uma informao sem alterar os demais bits.

Suponhamos que queiramos introduzir 4 bits (nibble) em um valor unsigned


char armazenado na varivel x.

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
//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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
//*******************************************************************

A funo introd_nibble() recebe como parmetro uma informao na varivel


x, introduz na parte alta de x o nibble 11012 e retorna o novo valor.

Em primeiro lugar mascarado o nibble superior de x com (x & 0x0f).

O resultado da expresso (x & 0x0f) sofre uma lgica OR com o valor


101100002 e o resultado final do comando atribudo varivel 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

Wagner da Silva Zanco

46

DETECTAR SINAL

Podemos utilizar os operadores lgicos para detectar se um determinado valor


positivo ou negativo. Vejamos o exemplo a seguir.

//*******************************************************************
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
}//*******************************************************************

A funo verifica_sinal() recebe como parmetro um valor inteiro na varivel x,


verifica o sinal do valor recebido e retorna 1 se ele for negativo ou 0 se for
positivo.
Todos os bits do valor recebido so mascarados pela expresso (x & 0x8000),
exceto o bit de sinal, o mais significativo.

Se o valor armazenado em x for positivo, a funo lgica & retorna 0; caso


contrrio, retorna 1.

O comando if testa a expresso e retorna o status do resultado: 1 para


negativo e 0 para positivo.
Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

47

MULTIPLICAO DE DIVISO COM


OS OPERADORES << e >>
Vejamos o que faz o programa-fonte main_09.c.
/*********************************************************************
Nome do arquivo:
main_09.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 = 5;
//declarao de varivel inicializada
unsigned char y;
//declarao de varivel no inicializada
unsigned char z;
//declarao de varivel no inicializada
y = x << 2;
//y = x multiplicado por 4
z = y >> 1;
//z = y dividido por 2
printf("y = %d\n",y);
//envia para a UART o valor de y
printf("z = %d\n",z);
//envia para a UART o valor de z
while (1);
//loop infinito
}//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

48

MULTIPLICAO DE DIVISO COM


OS OPERADOERES << e >>
String enviada para a UART1 pelo programa-fonte main_9.c.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

49

OPERADOR ?

Vejamos no exemplo a seguir a forma de utilizao do operador ?.


x = 10;
y = x < 5 ? 20 : 50;

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.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

50

OPERADORES DE PONTEIROS & E *


Os operadores de ponteiros & e * so utilizados quando desejamos conhecer ou
ter acesso ao endereo de memria alocado por uma varivel.

Pode ser necessrio, em determinadas aplicaes, conhecermos o endereo


utilizado pela varivel para acessar o seu contedo sem maiores complicaes.

Um ponteiro o endereo de memria de uma varivel.

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;

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

51

OPERADORES DE PONTEIROS & E *


Vejamos a seguir o que faz o programa-fonte main_10.c.

/*********************************************************************
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
}//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

52

OPERADORES DE PONTEIROS & E *


String enviada para a UART1 pelo programa-fonte main_9.c.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

53

OPERADOR CAST

O operador cast, ou especificador de tipo, utilizado quando necessrio


forar uma expresso a se tornar um tipo especfico de dado.

A forma geral do uso do cast :


(tipo) expresso
tipo: um tipo de dado padro em C.
expresso: pode ser uma varivel ou uma expresso vlida em C.

Esse operador foi utilizado no programa-fonte main_04.c, analisado no item


6.5.3 do captulo 6. Vejamos o exemplo a seguir.

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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

54

OPERADOR CAST

O exemplo a seguir converte o resultado da expresso em um tipo float.


Mesmo que a varivel x no seja do tipo float, o resultado ser convertido em
float devido ao cast (float).
(float) x*2;

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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

55

OPERADOR CAST

O operador cast pode resolver muitos problemas em expresses que utilizam


variveis de tipos diferentes, mas bom ter em mente que ele no a panaceia
para essa situao.

O ideal que operaes matemticas sejam efetuadas com valores do mesmo


tipo.
Mesmo com a utilizao do operador cast importante verificar se o resultado
da expresso o esperado quando operaes matemticas so efetuadas com
valores de tipos diferentes.
Essa verificao pode ser efetuada por meio da simulao da aplicao com o
MPLAB SIM.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

56

OPERADOR SIZEOF

O operador sizeof retorna, em bytes, o tamanho da varivel ou do


especificador de tipo que ele precede.

O tipo_de_dado pode ser qualquer um reconhecido pelo compilador.


sizeof varivel
sizeof (tipo_de_dado)
O operador sizeof foi definido para aumentar a portabilidade do programa-fonte,
permitindo ao programador se manter informado quanto quantidade de
memria que est sendo utilizada.

No exemplo a seguir, o comando printf() envia para a UART o tamanho da


varivel x, em bytes.

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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

57

OPERADOR VRGULA

O operador vrgula utilizado para possibilitar o encadeamento de expresses


no mesmo comando.

As expresses so avaliadas da esquerda para a direita, tornando a ltima


expresso depois da vrgula o valor de toda a expresso. Vejamos o exemplo a
seguir.

int x;
int y;

//declarao de varivel no inicializada


//declarao de varivel no inicializada
y = (x = 1, x++, x = x * 2); //y recebe o resultado de x*2

No exemplo anterior y recebe o valor 4, resultado da expresso x * 2. Como as


expresses so avaliadas da esquerda para a direita, primeiramente atribudo
varivel x o valor 1.
Depois o valor armazenado na varivel x incrementado pela expresso x++ e,
finalmente, multiplicado por 2.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

58

ABREVIAO DE EXPRESSES

A linguagem C permite que operadores binrios sejam associados com o


operador de atribuio = para permitir a abreviao de expresses, facilitando a
vida do programador em algumas situaes. Vejamos o exemplo a seguir.
x = x + 10;

O comando anterior pode ser abreviado da seguinte forma:


x += 10;

O operador += informa ao MPLAB C18 que o contedo da varivel x ser


somado ao valor 10.

Essa abreviao pode ser feita com todos os operadores binrios que
necessitam de dois operandos.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

60

ABREVIAO DE EXPRESSES
Vejamos a seguir a ordem de precedncia dos operadores apresentados.
Mais alta

Menor

()
!
sizeof
*
+
<<
<
==
&
^
|
&&
||
?
=
,

Microcontroladores PIC18F4520 com Linguagem C

[]
~

->
++ --

/
>>
<=
!=

%
>

>=

+=

-=

*=

(tipo)

/=

Wagner da Silva Zanco

61

&

EXERCCIOS

1. Os operadores esto divididos em vrios grupos. Quais so eles?


2. Qual a funo do operador de atribuio? D um exemplo de utilizao.
3. Qual a sintaxe a ser utilizada em um nico comando para atribuir o valor
20 s variveis x, y e z?
4. Quais so os operadores aritmticos.
5. Qual a funo dos operadores de incremento e de decremento?
6. Qual o valor armazenado na varivel y aps a execuo dos comandos a
seguir?
x=15;
y=x++;
7.

Qual a ordem de precedncia dos operadores aritmticos?

8.

Quais so os operadores relacionais?

9.

Qual a diferena entre os operadores = e ==?

10. Quais os valores retornados por uma expresso que contm operadores relacionais?

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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;

//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

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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?

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

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?

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

65

Вам также может понравиться