Microcontroladores
Prof. Eng. Derig Almeida Vidal
Mestre em Computação Aplicada, Engenheiro de Produção e Tecnólogo em Automática
Aula 05
Variáveis e Tipos de Dados
Prof. Derig Almeida Vidal, MsC
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
Tipos Básicos de Dados Disponíveis
Tipos de dados
Tamanho em
bits Descrição Exemplo
int 8 variáveis inteiras sem sinal, capacidade de 0 a 255
int X, Y=1, VAR1=0;
signed int 8 variáveis inteiras com sinal,
capacidade de –128 a 127 signed int VAR3 = -10; long 16 variáveis inteiras sem sinal,
capacidade de 0 a 65535 long A, B = 0, VAR2; signed long 16 variáveis inteiras com sinal, capac.
de –32768 a 32767 signed long GRAU=0; float 32 variáveis reais com sinal.
3.4 x 10-34a 3.4 x 1034 float VAR4, VAR5; short
ou boolean
1 variáveis lógicas, de um bit, podendo valer 0 ou 1
boolean FLAG1=0, SENSOR; short CHAVE;
Tipos Básicos de Dados Disponíveis
Tipos de dados
Tamanho em
bits Descrição Exemplo
int32 32
variáveis inteiras sem sinal, podendo valer de 0 a
4294967295
int32 CONTADOR;
signed int32 32
variáveis inteiras com sinal, podendo armazenar valores
de -2147483648 a 2147483647 signed int32 VAR10;
Char 8 variáveis que armazenam caracteres em forma de bytes.
char C = ‘a’, LETRA = ‘ ‘, H;
Prof. Derig Almeida Vidal, MsC
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, MsC
Código ASCII
Prof. Derig Almeida Vidal, MsC
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, MsC
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
Prof. Derig Almeida Vidal, MsC
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
Prof. Derig Almeida Vidal, MsC
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;
– signed int pode representar de -128 a +127
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.
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, MsC
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, MsC
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, MsC
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, MsC
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
Prof. Derig Almeida Vidal, MsC
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};
Prof. Derig Almeida Vidal, MsC
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
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’;
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, MsC
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, MsC
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, MsC
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, MsC
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
Prof. Derig Almeida Vidal, MsC
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
Prof. Derig Almeida Vidal, MsC
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 é
convertido no tipo base do tipo superior;
Conversão de tipos
Tipo da expressão
Tipo da
variá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.
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, MsC
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, MsC
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
Menor Ordem
Prof. Derig Almeida Vidal, MsC
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, MsC
Conversão de tipos
• Ex: float a,b; int c; long d; int32 e; a = 5.5; c = 10; d = 330; e = 100000;b = ((e / d) + c) * a; // o resultado b será 1721.5
Prof. Derig Almeida Vidal, MsC
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
Prof. Derig Almeida Vidal, MsC
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.
Conversão de tipos
• Resolvendo: long x; int y; y = 10;x = (float) (y * 100); // o resultado em x será 1000
Conversão de tipos
• Erro comum: long x,y; float z; y = 11; x = 2; z = 10 + (y / x); // o resultado será 15Prof. Derig Almeida Vidal, MsC
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, MsC
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, MsC
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, MsC
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;
Prof. Derig Almeida Vidal, MsC
Exercícios
1. Quais os tipos de dados básicos na linguagem C? 2. Qual é a diferença entre os tipos short int e int1? 3. Qual é a diferença entre uma variável signed e
outra unsigned?
4. Qual é a magnitude de armazenamento do tipo long int?
Prof. Derig Almeida Vidal, MsC
Exercícios
5. 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?
Exercícios
6. 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;
Exercícios
7. Qual é o resultado armazenado na variável “z” no programa a seguir? int x; long int y; float z; x = 110; y = 300; z = y / x;
Prof. Derig Almeida Vidal, MsC
Bibliografia
• PEREIRA, Fábio. Microcontroladores PIC: