IFCE – Campus Cedro
Mecatrônica Microcontroladores
Prof. Eng. Derig Almeida Vidal
Mestrando em Computação Aplicada, Engenheiro de Produção e Tecnólogo em Automática
Aula 09
Variáveis e Tipos de Dados
Prof. Derig Almeida Vidal IFCE - Cedro
Sumário
• Tipos Básicos de Dados Disponíveis
• Modificadores de Tipo • Outros tipos específicos do
compilador CCS C • Declaração de Variáveis • Variáveis Locais
• Códigos de Barra Invertida
• Constantes binárias, hexadecimais e octais • Operadores • Expressões • Conversão de tipos • Alocação de Memória • Redefinindo tipos de dados • Exercícios
Prof. Derig Almeida Vidal IFCE - Cedro
Tipos Básicos de Dados Disponíveis
• char (Caracter): O valor armazenado é um caractere.
• Caracteres geralmente são armazenados em códigos, usualmente o código ASCII, com 8 bits para cada um.
Prof. Derig Almeida Vidal IFCE - Cedro
Prof. Derig Almeida Vidal IFCE - Cedro
Tipos Básicos de Dados Disponíveis
• int: utilizado para representar números inteiros de 8 bits (0 a 255).
• float (ponto flutuante): utilizado para representar grandezas compreendidas entre 3,4-38e 3,4+38,
tanto para números fracionários como inteiros (os reais). Faz uso de 32 bits (4 posições na memória RAM) e para seu tratamento são necessários comandos complexos, desta forma devem ser utilizados com de forma cautelosa.
• void: utilizado em funções que não retornam valor algum.
Prof. Derig Almeida Vidal IFCE - Cedro
Modificadores de Tipo
• Além dos tipos de dados básicos podemos utilizar
modificadores para obtermos outros tipos de
dados. São eles: – signed
– unsigned – short – long
Modificadores de Tipo - signed
• Modifica um tipo base de dados de forma que possa representar números positivos e negativos. • Para isso é utilizado o MSB (Most Significant Bit ou
bit mais significativo) para representar o sinal do número, sendo:
– 1 para negativo; e, – 0 para positivo.
• É conhecido como complemento de 2, onde seu valor é complementado (bits invertidos um a um) e somado 1 ao resultado
Modificadores de Tipo - signed
• Como o é utilizado um bit para o sinal, a magnitude absoluta de representação do tipo modificado será a metade da magnitude do tipo não modificado. • Ex:
– int pode representar de 0 a 255;
Prof. Derig Almeida Vidal IFCE - Cedro
Modificadores de Tipo - unsigned
• Define um tipo de dado sem sinal (é o padrão do compilador CCS).
• Ex:
– int pode representar de 0 a 255;
– unsigned int pode representar de 0 a 255, também.
Prof. Derig Almeida Vidal IFCE - Cedro
Modificadores de Tipo - short
• Define uma variável com tamanho menor que o tipo modificado, ou seja, a versão reduzida do tipo especificado.
• Ex:
– int utiliza 8 bits (representando de 0 a 255); – short int utiliza 1 bit (representando apenas o 0
ou o 1), é também chamado de flag ou sinalizador.
Prof. Derig Almeida Vidal IFCE - Cedro
Modificadores de Tipo - long
• Amplia a magnitude de representação do tipo especificado.
• Ex:
– int utiliza 8 bits (representando 256 valores); – long int utiliza 16 bit (representando 65536
elementos), é também chamado de flag ou sinalizador.
Prof. Derig Almeida Vidal IFCE - Cedro
Outros tipos específicos do
compilador CCS C
• Encontramos no compilador CCS C outros tipos de dados, criados especificamente para a eficiência e compatibilidade do compilador junto a dispositivos como os PICs.
• São eles:
– int1: especifica valores de 1 bit (equivale ao short int);
– boolean: especifica valores booleanos de bit (equivale ao short int e int1);
– int8: especifica valores de 8 bits (equivalente ao int);
Prof. Derig Almeida Vidal IFCE - Cedro
Outros tipos específicos do
compilador CCS C
– byte: especifica valores de 8 bits (equivale ao int e int8);
– int16: especifica valores de 16 bits (equivale ao long int);
– int32: especifica valores de 32 bits;
Prof. Derig Almeida Vidal IFCE - Cedro
Outros tipos específicos do compilador CCS C Tipo Tamanho em Bits Faixa de Valores
short int, int1, boolean 1 0 ou 1
char 8 0 a 255
signed char 8 -128 a 127
unigned char 8 0 a 255
int, int8, byte 8 0 a 255
signed int, signed byte 8 -128 a 127
unsigned int, unsigned 8 0 a 255
long int, int16 16 0 a 65.535
signed long int 16 - 32.768 a 32.767
unsigned long int 16 - 32.768 a 32.767
int32 32 0 a 4.294.967.295
signed int32 32 -2.147.483.648 a 2.147.483.647
unsigned int32 32 0 a 4.294.967.295
float 32 3.4-38a 3.4+38
Declaração de Variáveis
• Em C é necessário declarar a variável antes de poder usá-la.
• A declaração informa ao compilador que uma variável X é do tipo Y.
• O nome deve conter 31 caracteres e não pode iniciar com número.
• Podemos declarar da seguinte forma:
– TIPO nome_da_variavel{,outras_variaveis}; – TIPO nome_da_variavel =
valor_da_variavel{,outras_variaveis};
Declaração de Variáveis
• Ex:
– unsigned int tempo; // Declaramos a variável tempo
– int tempo; // Declaramos a variável tempo
– int tempo = 10; // Declaramos e inicializamos a variável tempo
Prof. Derig Almeida Vidal IFCE - Cedro
Regras de escopo da linguagem
• Uma variável pode ser declarada em três pontos distintos do programa:
– No corpo principal do programa: fora de qualquer função, inclusive da main() são chamadas de globais e podem ser acessadas de qualquer ponto do programa;
– Dentro de uma função: incluindo a função main() somente podem ser acessadas de dentro da função em que foram declaradas (são chamadas de locais). No momento em que ocorre o retorno da função elas são descartadas;
– Como parâmetro formal de uma função: são um tipo especial de variável local;
Prof. Derig Almeida Vidal IFCE - Cedro
Ex:
#include <16f628a.h>#use delay(clock=4000000)#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1) int somatorio;
void soma(int valor) {
int conta;
somatorio = somatorio + valor; printf("A soma de 0");
for (conta=1;(conta<(valor+1));conta++) printf("+%u",conta); printf("e igual a %u\r\n",somatorio);
} void main() {
int conta=12; somatorio = 0;
for (conta=0; conta<20; conta++) { soma(conta); } } Variável Global Variável Local Variável de Parâmetro
Prof. Derig Almeida Vidal IFCE - Cedro
No Proteus
Prof. Derig Almeida Vidal IFCE - Cedro
Resultado
A soma de 0e igual a 0 A soma de 0+1e igual a 1 A soma de 0+1+2e igual a 3 A soma de 0+1+2+3e igual a 6 A soma de 0+1+2+3+4e igual a 10 A soma de 0+1+2+3+4+5e igual a 15 A soma de 0+1+2+3+4+5+6e igual a 21 A soma de 0+1+2+3+4+5+6+7e igual a 28 A soma de 0+1+2+3+4+5+6+7+8e igual a 36 A soma de 0+1+2+3+4+5+6+7+8+9e igual a 45 A soma de 0+1+2+3+4+5+6+7+8+9+10e igual a 55 A soma de 0+1+2+3+4+5+6+7+8+9+10+11e igual a 66 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12e igual a 78 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13e igual a 91 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14e igual a 105 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15e igual a 120 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16e igual a 136 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17e igual a 153 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18e igual a 171 A soma de 0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19e igual a 190Prof. Derig Almeida Vidal IFCE - Cedro
#use
#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B3) • A diretiva rs232 é utilizada para ordenar ao
compilador que gere um código para comunicação serial utilizando uma interface serial assíncrona padrão rs232.
• Os parâmetros são os seguintes (respectivamente): – Velocidade de comunicação em bps;
– Pino de saída dos dados transmitidos; – Pino de entrada dos dados recebidos.
Prof. Derig Almeida Vidal IFCE - Cedro
Variáveis Locais
• São aquelas declaradas dentro de um bloco de código; int x; x = 5; if (x>2) { int y;
if ((y = input_a())==3) output_b(0); else output_b(x+1);
}
Constantes
• São valores (numéricos ou não) fixos e que não podem ser alterados pelo programa durante a sua execução;
• Na declaração é informado apenas o nome e o valor. Ex:
const val1 = 10 const val2 = -5 const val3 = 55.12 const val4 = ‘a’ const val5 = “teste”
Códigos de Barra Invertida
• Colocar todas as constantes caractere entre aspas funciona para muitos caracteres, mas alguns, como o retorno de carro, são impossíveis de serem inseridos em uma string a partir do teclado.
Prof. Derig Almeida Vidal IFCE - Cedro
Códigos de Barra Invertida
Código Caractere Código ASCII
\yyy Constante Octal yyy
-\xyyy Constante hexadecimal
-\0 Nulo (null) 0
\a Campainha (BEL) 07h
\b Retrocesso (backspace) 08h
\t Tabulação horizontal (TAB) 09h
\n Nova linha (line feed) 0Ah
\v Tabulação vertical (vertical TAB) 0Bh
\f Avanço de formulário (form feed) 0Ch
\r Retorno de carro (Return) 0Dh
\” Aspas 22h
\’ Apóstrofo 27h
\\ Barra invertida “\” 5Ch
Prof. Derig Almeida Vidal IFCE - Cedro
Constantes binárias, hexadecimais e
octais
• A linguagem C prevê a capacidade de manusear dados numéricos nas bases binária, octal, decimal e hexadecimal. Ex: int valor; valor = 50; valor = 050; valor = 0x50; valor = 0b01010000;
Valor Base Numérica
99 Decimal
099 Octal
0x99 Hexadecimal 0b10011001 Binário
Prof. Derig Almeida Vidal IFCE - Cedro
Operadores
• Adiantando, o C possui diversos operadores, sejam eles:
– Aritméticos (soma (+), subtração (-),
multiplicação (*), divisão (/), resto da divisão (%), incremento (++) e decremento (--));
– Lógicos e relacionais (maior (>), menor(<), igual (==), diferente (!=), AND (&&) OR (||)); e, – Muitos outros.
Prof. Derig Almeida Vidal IFCE - Cedro
Expressões
• São elementos formados pela união de variáveis, constantes e operadores entre si.
• Seguem as mesmas regras gerais das expressões algébricas em matemática.
• Ex:
custo = valor; a = b + 1; teste * 3;
Prof. Derig Almeida Vidal IFCE - Cedro
Expressões
• Também é possível a utilização de expressões condicionais.
• Ex:
int x,y; x = 10;
y = (x>5) * 10;
• No exemplo se x for maior que 5, y será igual a 10, pois quando o resultado é verdadeiro, é assumido o valor de 1, se falso é 0 (o que resultaria em y=0).
Prof. Derig Almeida Vidal IFCE - Cedro
Expressões
• Outra característica importante é que não existe a verificação de tipos. • Ex: unsigned int8 a; unsigned int16 b; unsigned int32 c; b = 300; c = 100000;
a = c – b; // a possui 8 bits e o resultado 116 • Em outras linguagens essa operação geraria um
erro, mas no C isso não ocorre.
Expressões
• Como o a possui apenas 8 bits, ele não dispõe de capacidade para armazenar c – b que resulta no valor 99700 (valor de 17 bits).
• A ferramenta que torna esta operação possível é chamada de conversão de tipos.
• Ex:
O resultado 99700 precisa de 17 bits mas é armazenado utilizando 32, veja:
99700 = 00000000 00000001 10000101 01110100 É convertido em um valor com apenas 8 bits:
116 = 01110100
Conversão de tipos
• Sempre que tivermos uma expressão composta de tipos diferentes entre si, será aplicada a conversão de tipos.
• As regras de conversão são:
– Em uma atribuição, o tipo do dado resultante da expressão é convertido no tipo de dado da variável que recebe a atribuição;
– Todos os tipos short int e char são convertidos no seu tipo base imediatamente superior, ou seja, int; – Cada par de operandos de tipos diferentes é
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
Tipo da expressão Tipo davariável alvo Resultado
short int char, int, long int ou int32
Somente o bit 0 é utilizado; os outros bits são zerados
char, int, long int ou int32
short int O bit 0 do resultado da expressão é armazenado na variável; os outros bits são descartados.
char ou int long int ou
int32
O byte LSB da variável; assume o resultado da expressão; a parte MSB é zerada.
long int ou int32 char ou int Os 8 bits menos significativos do resultado da expressão são
armazenados na variável; os outros bits são descartados.
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
Tipo da expressão
Tipo da
variável alvo Resultado
int32 long int Os 16 bits menos significativos do
resultado da expressão são
armazenados na variável; os demais bits são descartados.
int32 float O valor da expressão é truncado para o
armazenamento na variável float; possível perda da dados.
float short int O bit menos significativo da parte inteira
do resultado da expressão é armazenado na variável.
float char ou int Os 8 bits menos significativos da parte
inteira do resultado da expressão são armazenados na variável.
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
Tipo da expressão
Tipo da
variável alvo Resultado
float Long int Os 16 bits menos significativos da parte
inteira do resultado da expressão são armazenados na variável.
float int32 A parte inteira do resultado da expressão
e armazenada na variável.
Signed Unsigned Se o resultado da expressão for
negativo, o resultado será maior que o módulo do resultado.
Unsigned Signed Se o resultado da expressão for maior
que o extremo de faixa do tipo, o resultado será negativo.
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
• No caso de uma operação envolvendo dois tipos diferentes, o tipo de menor ordem será convertido no tipo de maior ordem, conforme esta seqüência:
float int32
long int ou int16 char, int ou int8 short int ou int1 Maior Ordem
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
• Ex: int x,y; long z; x = 5; z = 1000;y = x + z; // o resultado será igual a 237 decimal • x + z resulta em um tipo long que depois é
convertido no mesmo tipo de y (ou seja, int), provocando a truncagem dos 8 bits mais significativos.
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
• Ex: float a,b; int c; long d; int32 e; a = 5.5; c = 10; d = 330; e = 10000;b = ((e / d) + c) * a; // o resultado b será 1721.5 • Passa-se para int32 e depois para float.
Conversão de tipos
• É possível forçar uma expressão a ser de um tipo específico usando-se uma construção chamada de modelador.
• A forma geral de um modelador é: (novo_tipo) expressão
• Ex:
X / 2; // o resultado será tipo int (float) (x / 2); // o resultado será tipo float
Conversão de tipos
• Erro comum: long x; int y; y = 10; x = y * 100; // o resultado em x será 232• A multiplicação de y (8 bits) por 100 (8 bits) produz outro resultado de 8 bits.
• Depois é convertido em um de 16 bits e armazenado em x.
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
• Resolvendo: long x; int y; y = 10;x = (float) (y * 100); // o resultado em x será 1000
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
• Erro comum: long x,y; float z; y = 11; x = 2; z = 10 + (y / x); // o resultado será 15• Como x e y são inteiros a divisão é inteira.
Prof. Derig Almeida Vidal IFCE - Cedro
Conversão de tipos
• Resolvendo: long x,y; float z; y = 11; x = 2;z = 10 + ((float) y / x); // o resultado será 15,5
Prof. Derig Almeida Vidal IFCE - Cedro
Alocação de Memória
• Cada vez que declaramos uma variável o
compilador irá reservar um ou mais endereços de memória RAM de forma a armazenar a variável. • As variáveis do tipo inteiro são armazenados
iniciando-se pela parte menos significativa (LSB) para a parte mais significativa.
• Ex: para o valor: 0x12345678 Endereço Conteúdo 0x20 0x78 0x21 0x56 0x22 0x34 0x23 0x12
Prof. Derig Almeida Vidal IFCE - Cedro
Alocação de Memória
• No caso de variáveis tipo float o formato utilizado é o ponto flutuante adotado pela Microchip.
• Onde:
– eb é o expoente do número somado com 127; – s é o bit de sinal;
– f0, f1 e f2 armazenam a parte fracionária do número; – y é o bit LSB do expoente eb.
Formato eb f0 f1 f2
IEEE754 sxxx xxxx y.xxx xxxx xxxx xxxx xxxx xxxx Microchip xxxx xxxx s.xxx xxxx xxxx xxxx xxxx xxxx
Prof. Derig Almeida Vidal IFCE - Cedro
Redefinindo tipos de dados
• A linguagem C ainda provê um comando que permite definir novos nomes para os tipos de dados existentes.
• A sua forma geral é:
typedef tipo novo_nome
• Ex:
typedef float fracao; fracao variavel;
Exercícios
• Quais os tipos de dados básicos na linguagem C padrão?
• Qual é a diferença entre os tipos short int e int1 no compilador CCS?
• Qual é a diferença entre uma variável signed e outra unsigned?
• Qual é a magnitude de armazenamento do tipo long int?
Exercícios
• Suponha que o valor -1 é armazenado em uma variável do tipo signed int e em um determinado ponto do programa essa variável é atribuída a outra do tipo unsigned int. qual é o valor efetivamente armazenado na variável?
• Qual é o resultado armazenado na variável “y” no programa a seguir?
int x,y; x = 5;
Prof. Derig Almeida Vidal IFCE - Cedro
Exercícios
• Qual é o escopo (global/local) de cada uma das variáveis do programa a seguir?
int test;
int funcao1(int a, int b) { return a+b; } main () { int valor; valor = 5; teste = funcao(valor, 10); }
Prof. Derig Almeida Vidal IFCE - Cedro
Exercícios
• Qual é o resultado armazenado na variável “x” no programa a seguir? int x,y; long int z; z = 0x1234; y = z + 1; x = y + 1;
Prof. Derig Almeida Vidal IFCE - Cedro
Exercícios
• Qual é o resultado armazenado na variável “z” no programa a seguir? int x; long y; Float z; x = 110; y = 300; z = y / x;
Prof. Derig Almeida Vidal IFCE - Cedro
Bibliografia
• PEREIRA, Fábio. Microcontroladores PIC: