
Passo 1 de 8
Nome, tipo e valor de uma variável
Reconheça nome, tipo e valor em uma declaração e inicialize variáveis inteiras com identificadores válidos.
Trilha de aprendizado · Nível 9 · Tutorial 2
Declare variáveis e constantes adequadas aos dados do programa e acompanhe como seus valores mudam durante a execução no Uno R3.
Nome, tipo e valor de uma variável
Reconheça nome, tipo e valor em uma declaração e inicialize variáveis inteiras com identificadores válidos. 2 min
Como as atribuições mudam os valores
Acompanhe instruções sequenciais e determine como atribuições substituem ou copiam valores entre variáveis. 3 min
Estados lógicos e faixas dos inteiros
Escolha bool ou um tipo inteiro no Uno R3 considerando estados, sinal e a faixa completa de valores. 3 min
Tipos com largura explícita
Use `stdint.h` e tipos inteiros de largura explícita para comunicar a faixa necessária de cada dado no Uno R3. 3 min
Valores fracionários com float
Reconheça dados fracionários e trate valores float como aproximações de precisão limitada no Uno R3. 2 min
Valores que não devem mudar: const
Declare parâmetros fixos com const e diferencie-os de dados de estado que podem mudar. 2 min
Onde a variável existe e por quanto tempo
Diferencie o acesso e a permanência de variáveis globais e locais automáticas em um sketch do Uno R3. 3 min
Aplicação final: declarar e rastrear dados
Complete declarações de um sketch curto, rastreie suas atribuições e diferencie dados que permanecem daqueles recriados em cada chamada. 3 min

Passo 1 de 8
Reconheça nome, tipo e valor em uma declaração e inicialize variáveis inteiras com identificadores válidos.
Uma variável é um espaço de armazenamento que o programa identifica por um nome e usa conforme um tipo. Ela também guarda um valor.
Neste início, usaremos int para valores inteiros pequenos. Observe a declaração abaixo: ela apresenta a variável ao programa e já define seu primeiro valor.

Em int ledCount = 3;, int indica o tipo, ledCount é o nome e 3 é o valor inicial.
Declaração inicializada de uma variável inteira.
int ledCount = 3;Uma declaração inicializada segue esta estrutura:
tipo nome = valor;
O sinal = define o valor inicial neste momento, e o ponto e vírgula ; encerra a instrução. Declarar é criar um nome que o programa poderá reconhecer; inicializar é fornecer seu valor inicial.
Adote a inicialização explícita: declare a variável já com um valor conhecido antes de usá-la nos exemplos.
Dica
Uma declaração não inicializada, como int tentativas;, será evitada neste tutorial. Sem um valor inicial explícito, não use a variável como se soubesse qual valor ela contém.
Escolha nomes que revelem o que o dado representa. Um identificador pode usar letras, números e _, mas não pode ter espaços nem começar por número.
C/C++ diferencia maiúsculas de minúsculas: total, Total e TOTAL são nomes diferentes. Também não use palavras reservadas pela linguagem, como int ou for.
Atenção
Associe cada nome à descrição correta.
Qual destes é um nome válido para uma variável que guarda uma quantidade de peças?
Complete a declaração de uma variável inteira para registrar tentativas, começando em zero.
= ;
Passo 2 de 8
Acompanhe instruções sequenciais e determine como atribuições substituem ou copiam valores entre variáveis.
Uma atribuição coloca um novo valor em uma variável que já foi declarada. Sua forma é nome = valor;.
Leia = como “recebe”, não como igualdade matemática. Ao executar contador = 8;, o valor que estava guardado em contador é substituído por 8.
As instruções são executadas na ordem em que aparecem. Para descobrir o valor atual, acompanhe uma linha de cada vez.

O nome e o tipo da variável permanecem; a atribuição substitui apenas o valor armazenado.
As duas variáveis deste trecho já receberam valores iniciais. Leia as instruções de cima para baixo. Primeiro, nivel recebe 5. Depois, referencia recebe uma cópia do valor que nivel guarda naquele instante.
Trecho para rastrear valores; não é necessário executá-lo.
int nivel = 2;
int referencia = 7;
nivel = 5;
referencia = nivel;
nivel = 9;Dica
Na linha referencia = nivel;, o programa lê o valor disponível em nivel naquele momento — 5 — e o copia para referencia.
Depois, nivel = 9; altera somente nivel. A cópia em referencia continua com 5: as variáveis não formam um vínculo permanente.
Uma tabela de rastreamento mostra o estado logo após cada instrução. Comece pelas inicializações e, em cada nova linha, altere somente a variável que está à esquerda de =.
Valores após cada instrução do trecho anterior.
| Instrução executada | nivel | referencia |
|---|---|---|
| int nivel = 2; | 2 | — |
| int referencia = 7; | 2 | 7 |
| nivel = 5; | 5 | 7 |
| referencia = nivel; | 5 | 5 |
| nivel = 9; | 9 | 5 |
Preencha os valores registrados logo após cada uma das duas atribuições. O primeiro ponto de conferência ocorre logo após a cópia; o segundo ocorre depois que a variável de origem recebe outro valor.
Complete os dois pontos de conferência do rastreamento.
int leitura = 4;
int registro = 1;
registro = leitura; // depois: leitura = , registro =
leitura = 6; // depois: leitura = , registro = 
Passo 3 de 8
Escolha bool ou um tipo inteiro no Uno R3 considerando estados, sinal e a faixa completa de valores.
Um dado com apenas dois estados possíveis usa o tipo bool. Os valores são escritos como true e false.
Use bool para expressar o significado lógico do dado, por exemplo “o alarme está ativo?”. Isso não quer dizer que uma variável bool ocupe necessariamente um único bit na memória: tipo e organização de armazenamento são assuntos diferentes.
Exemplo
Exemplos de estados lógicos inicializados:
Dois estados possíveis, expressos de forma clara no código.
bool alarmeAtivo = false;
bool portaAberta = true;
Um bool representa uma escolha lógica entre dois estados, não uma medida numérica contínua.
Para contagens e medidas inteiras, escolha primeiro se o dado pode ser negativo.
unsigned, quando todos os valores previstos forem de zero para cima.Depois, confira se o maior e o menor valor previstos cabem na faixa do tipo. Não escolha pelo valor atual isolado: considere todos os valores que o dado poderá assumir.
No Arduino Uno R3, estas são as faixas dos tipos inteiros usados neste step.
| Tipo | Bits | Menor valor | Maior valor |
|---|---|---|---|
| int | 16 | -32768 | 32767 |
| unsigned int | 16 | 0 | 65535 |
| long | 32 | -2147483648 | 2147483647 |
| unsigned long | 32 | 0 | 4294967295 |

Os tipos sem sinal usam toda a faixa para zero e valores positivos; os tipos long alcançam intervalos muito maiores.
Atenção
Essas larguras valem para o Uno R3 usado aqui. Em outra placa, um int ou long pode ter outra largura e outra faixa. Consulte a documentação da plataforma antes de reutilizar essa escolha.
Associe cada requisito ao tipo mais adequado no Uno R3. Considere somente os valores informados.
Faça as associações.
Toque em um item e depois no par correspondente.
Analise a declaração. A variável deve registrar uma contagem que nunca é negativa e pode chegar a 65535 no Uno R3.
Preencha a lacuna com o tipo adequado.
amostrasRegistradas = 65535;No Uno R3, qual tipo apresentado comporta o valor inteiro não negativo 70000?

Passo 4 de 8
Use stdint.h e tipos inteiros de largura explícita para comunicar a faixa necessária de cada dado no Uno R3.
Além de int e long, você pode usar tipos cujo nome informa a largura desejada. Isso comunica quantos bits o dado exige e evita depender do tamanho que outros nomes podem ter em outra plataforma.
Leia uint8_t assim:
u significa sem sinal: somente valores de zero para cima.u, como em int16_t, indica um tipo com sinal._t faz parte do nome do tipo.Assim, um dado limitado a 0–255 pode usar uint8_t. Para escolher, considere sempre o intervalo completo previsto, inclusive seus limites.

O sinal define se há valores negativos; a largura define o tamanho da faixa disponível.
Para usar esses nomes no sketch, inclua o cabeçalho stdint.h no início do código. A diretiva começa com # e não termina com ponto e vírgula. Ela disponibiliza nomes como uint8_t e int16_t para o compilador reconhecer.
Exemplo de declarações no início de um sketch.
#include <stdint.h>
uint8_t nivel = 255;
int16_t ajuste = -120;
uint16_t contagem = 50000;
uint32_t total = 100000;
void setup() {
}
void loop() {
}No Uno R3, os tipos de 16 e 32 bits correspondem às faixas estudadas anteriormente. Escolha um tipo que comporte todos os valores previstos, não apenas o valor atual.
| Tipo | Sinal | Bits | Faixa |
|---|---|---|---|
| uint8_t | sem sinal | 8 | 0 a 255 |
| int16_t | com sinal | 16 | -32768 a 32767 |
| uint16_t | sem sinal | 16 | 0 a 65535 |
| uint32_t | sem sinal | 32 | 0 a 4294967295 |
Associe cada tipo à sua característica. Preste atenção ao u: ele indica que a faixa não inclui valores negativos.
Faça as associações.
Toque em um item e depois no par correspondente.
Um firmware precisa declarar codigo = 256 e correcao = -1. Qual par de tipos é adequado no Uno R3?
Complete o início deste trecho. codigo deve ir de 0 a 255; correcao pode ir de -200 a 200; e amostras pode chegar a 60000. Use o cabeçalho e tipos que expressem esses requisitos.
Preencha as quatro lacunas.
codigo = 255;
correcao = -200;
amostras = 60000;
Passo 5 de 8
Reconheça dados fracionários e trate valores float como aproximações de precisão limitada no Uno R3.
Use float quando o dado pode ter uma parte fracionária. Por exemplo, uma distância fictícia de 12,75 unidades não cabe integralmente em um tipo inteiro, pois o valor após a vírgula faz parte do dado.
Já uma contagem, como 12 peças, é inteira e pode usar um tipo inteiro adequado à sua faixa. O tipo descreve o tipo de valor que o programa pretende guardar — não apenas como o número costuma ser escrito.

Contagens usam valores inteiros; grandezas que incluem fração podem precisar de float.
Duas declarações inicializadas: uma contagem e uma medida fracionária.
unsigned int quantidadePecas = 12;
float distanciaMedida = 12.75f;No Uno R3, um float tem precisão limitada a aproximadamente 6 ou 7 algarismos significativos. Esses algarismos começam no primeiro dígito diferente de zero e contam todos os dígitos relevantes do valor.
Assim, 1234567 tem 7 algarismos significativos, enquanto 0.001234567 também tem 7. Não é correto interpretar essa característica como “6 ou 7 casas depois da vírgula”.
Dica
Muitos números decimais não podem ser guardados exatamente em um float. Portanto, trate o valor armazenado como uma aproximação do valor que você escreveu.
Para dados fracionários comuns, float é útil; porém, não prometa precisão ilimitada. Ao escolher o tipo, considere tanto a necessidade de fração quanto a quantidade de algarismos relevantes para seu dado.
A afirmação é verdadeira ou falsa?
“Como float tem cerca de 6 a 7 algarismos significativos no Uno R3, todo valor com até 7 casas depois da vírgula é armazenado exatamente.”
Escreva pelo menos 40 caracteres (0/40).
Complete a declaração para guardar uma medida fictícia que pode ter parte fracionária. O sufixo f deixa explícito que o literal é um valor float.
Escreva pelo menos 30 caracteres (0/30).
Preencha o tipo adequado.
nivelFicticio = 18.25f;Qual declaração representa melhor estes dados fictícios?

Passo 6 de 8
Declare parâmetros fixos com const e diferencie-os de dados de estado que podem mudar.
constUse const quando um dado é um parâmetro fixo do programa: ele recebe um valor na declaração e não pode receber outro depois.
const float LIMITE_TEMPERATURA = 35.0f;A constante continua tendo um tipo. Aqui, float é adequado porque o limite tem parte fracionária. O nome em maiúsculas é uma convenção útil para destacar valores fixos, mas o que realmente impede a alteração é const.

Uma variável representa um estado que pode mudar; uma constante representa um parâmetro que deve permanecer fixo.
Compare os dois dados abaixo. Ambos são declarados e inicializados, mas têm papéis diferentes.
Trecho para estudar
int contagem = 0;
const uint16_t LIMITE_AMOSTRAS = 500;
contagem = 1; // permitido
// LIMITE_AMOSTRAS = 600; // inválido: a constante não pode ser alteradaDica
contagem é um estado: seu valor pode ser substituído durante a execução. Já LIMITE_AMOSTRAS é um parâmetro definido para este programa. Como 500 é inteiro não negativo e cabe de 0 a 65535, uint16_t é um tipo adequado no Uno R3.
Uma constante precisa ser inicializada na própria declaração. Assim, o programa já sabe qual valor ela deve preservar.
Relacione cada declaração ao seu papel no firmware.
Associe cada declaração à descrição correta.
Toque em um item e depois no par correspondente.
Complete a declaração de um parâmetro fixo. O valor é um inteiro não negativo entre 0 e 255.
uint8_t BRILHO_INICIAL = 120;Considere o código:
int leituras = 0;
const int LIMITE = 10;
leituras = 1;
LIMITE = 12;Qual linha de atribuição é inválida?

Passo 7 de 8
Diferencie o acesso e a permanência de variáveis globais e locais automáticas em um sketch do Uno R3.
Duas perguntas diferentes ajudam a entender uma variável:
Uma variável global é declarada antes de setup() e loop(). Seu nome pode ser usado nas duas funções e ela permanece existindo enquanto o programa está em execução.
Uma variável local automática é declarada dentro de um bloco entre chaves. Seu nome só pode ser usado da declaração até o fim desse bloco. Ela existe apenas enquanto aquele bloco está sendo executado.

A posição da declaração determina onde o nome é visível e quando a variável existe.
Declare uma global antes das funções quando o dado precisar continuar disponível entre as chamadas de loop(). Ela deve ser inicializada explicitamente, como nos exemplos anteriores.
Sketch para observar uma variável global e uma local automática.
bool estadoRegistrado = false;
void setup() {
}
void loop() {
bool sensorLido = true;
estadoRegistrado = sensorLido;
}estadoRegistrado é global: foi declarada antes de setup() e loop(). Portanto, pode ser usada em ambas as funções e retém o valor recebido na chamada anterior de loop().
sensorLido é local automática: só pode ser usada depois de sua declaração e antes da chave } de loop(). Fora desse bloco, esse nome não existe.
Toda vez que o ambiente chama loop(), a variável local automática é criada novamente e sua inicialização é executada de novo. Neste caso, sensorLido recebe true em cada chamada.
Ao chegar à chave final de loop(), sensorLido deixa de existir. Já estadoRegistrado continua existindo e guarda o último valor atribuído enquanto o programa permanece em execução.
Rastreamento de duas chamadas de loop() para o código mostrado.
| Momento | estadoRegistrado | sensorLido |
|---|---|---|
| Antes da 1ª chamada | false | não existe |
| Após a declaração na 1ª | false | true |
| Fim da 1ª chamada | true | deixa de existir |
| Antes da 2ª chamada | true | não existe |
| Após a declaração na 2ª | true | true |
| Fim da 2ª chamada | true | deixa de existir |
Atenção
Não leia uma variável local automática que não recebeu valor inicial. Não suponha que ela comece em zero nem que conserve o valor de uma chamada anterior. Inicialize-a na declaração antes de usá-la.
Para cada ponto do sketch, associe quais nomes podem ser usados. Considere que sensorLido já foi declarado quando indicado.
Associe cada trecho à combinação correta de nomes que pode ser usada nele.
Toque em um item e depois no par correspondente.
Complete o rastreamento de duas chamadas do loop() do sketch estudado. As lacunas estão em comentários: elas registram o estado em cada momento.
Preencha os valores observados e acompanhe quando a variável local existe.
bool estadoRegistrado = false;
void setup() {
}
void loop() {
bool sensorLido = true;
estadoRegistrado = sensorLido;
}
// Antes da 1ª chamada: estadoRegistrado = ; sensorLido não existe.
// No fim da 1ª chamada: estadoRegistrado = ; sensorLido deixa de existir.
// Antes da 2ª chamada: estadoRegistrado = ; sensorLido não existe.
// Após declarar sensorLido na 2ª: estadoRegistrado = ; sensorLido = .
// No fim da 2ª chamada: estadoRegistrado = ; sensorLido deixa de existir.
Passo 8 de 8
Complete declarações de um sketch curto, rastreie suas atribuições e diferencie dados que permanecem daqueles recriados em cada chamada.
Considere estes requisitos fictícios para um Uno R3:
sistemaAtivo: estado com duas possibilidades.contagem: número não negativo de 0 a 2000.temperaturaC: medida que pode ter parte fracionária.LIMITE_LEITURAS: parâmetro fixo igual a 8.As escolhas adequadas são bool, uint16_t, float e const uint8_t, respectivamente. As declarações globais ficam antes de setup() e loop().

Os dados globais permanecem disponíveis durante a execução; um dado criado dentro de loop pertence somente àquela chamada.
Complete as declarações conforme os requisitos. O cabeçalho disponibiliza os nomes de tipos com largura explícita. O parâmetro fixo precisa de const e recebe seu valor já na declaração.
Preencha os quatro trechos ausentes.
#include <stdint.h>
sistemaAtivo = false;
contagem = 0;
temperaturaC = 23.5f;
LIMITE_LEITURAS = 8;As quatro primeiras declarações são globais. Dentro de loop(), estadoNestaChamada e temperaturaRegistrada são locais automáticas: surgem ao entrar no bloco e deixam de existir ao sair dele.
Leia uma instrução por vez. = substitui o valor à esquerda; quando o lado direito é outra variável, o valor atual é copiado naquele instante.
Sketch completo para rastreamento e compilação opcional
#include <stdint.h>
bool sistemaAtivo = false;
uint16_t contagem = 0;
float temperaturaC = 23.5f;
const uint8_t LIMITE_LEITURAS = 8;
void setup() {
}
void loop() {
bool estadoNestaChamada = true;
sistemaAtivo = estadoNestaChamada;
contagem = 12;
float temperaturaRegistrada = temperaturaC;
estadoNestaChamada = false;
}Sketch uses 928 bytes (2%) of program storage space. Maximum is 32256 bytes. Global variables use 10 bytes (0%) of dynamic memory, leaving 2038 bytes for local variables. Maximum is 2048 bytes.
A mensagem exata pode variar conforme a versão e o idioma da IDE. O essencial é a indicação de que a compilação foi concluída sem erros.
Atenção
Se quiser, copie o sketch para um arquivo .ino no seu computador, selecione Arduino Uno e use apenas Verificar na IDE. Uma compilação aceita confirma que a sintaxe e os tipos foram aceitos pelo compilador, como na saída mostrada. Ela não comprova os valores durante a execução nem garante que uma faixa atende a todos os casos reais. Nesta atividade, confira os valores por rastreamento manual.
Use o sketch da tela anterior. Para cada linha da tabela, registre o estado logo após a instrução indicada. A coluna de uma variável local recebe “não existe” antes de sua declaração e depois da saída de loop().
Lembre-se: temperaturaRegistrada = temperaturaC; copia o valor disponível de temperaturaC, e mudar estadoNestaChamada no fim não altera sistemaAtivo.
Preencha a tabela em seu caderno ou em uma nota. Depois compare com o gabarito na próxima tela.
| Após a instrução | sistemaAtivo | contagem | temperaturaRegistrada | estadoNestaChamada |
|---|---|---|---|---|
| entrada no loop | ? | ? | não existe | não existe |
| criar estado local | ? | ? | não existe | ? |
| copiar estado | ? | ? | não existe | ? |
| atribuir contagem | ? | ? | não existe | ? |
| copiar temperatura | ? | ? | ? | ? |
| alterar estado local | ? | ? | ? | ? |
| sair do loop | ? | ? | não existe | não existe |
Após a saída de loop(), qual afirmação descreve corretamente a próxima chamada?
Escreva pelo menos 50 caracteres (0/50).
Resultado de uma chamada de loop(). A constante não aparece nas atribuições porque preserva o mesmo valor: LIMITE_LEITURAS = 8.
| Após a instrução | sistemaAtivo | contagem | temperaturaRegistrada | estadoNestaChamada |
|---|---|---|---|---|
| entrada no loop | false | 0 | não existe | não existe |
| criar estado local | false | 0 | não existe | true |
| copiar estado | true | 0 | não existe | true |
| atribuir contagem | true | 12 | não existe | true |
| copiar temperatura | true | 12 | 23.5 | true |
| alterar estado local | true | 12 | 23.5 | false |
| sair do loop | true | 12 | não existe | não existe |
Resumo
bool; uma faixa não negativa de 0 a 2000 cabe em uint16_t; parte fracionária pede float.const para um parâmetro que o programa não deve alterar e inicialize-o na declaração.Parabéns! Você concluiu: Variáveis e tipos no firmware
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks