Exercício 9: Crie um programa em C++ que:
Declare uma variável float a e uma int b.
Atribua o valor 3.7 a a.
Some
armazene em b (observe a conversão implícita).
Imprima o resultado e discuta o que aconteceu.
Declare uma variável float a e uma int b.
Atribua o valor 3.7 a a.
Some
Imprima o resultado e discuta o que aconteceu.
Passo 1
O enunciado pede que eu faça três coisas concretas:
- Declarar uma variável do tipo float chamada
e uma variável do tipo int chamada . - Atribuir o valor
a . - Somar
e armazenar o resultado em (observando a conversão implícita do tipo float para int). - Imprimir o resultado e explicar o que aconteceu.
Informações relevantes dadas pelo enunciado:
- Valor inicial de
é . -
é do tipo inteiro ( ) e receberá o resultado da soma entre e . - Há uma conversão implícita envolvida ao atribuir um valor em ponto flutuante para uma variável inteira.
Passo 2
Aqui está um programa C++ mínimo que faz exatamente o pedido (vou comentar linha a linha depois):
#include <iostream>
int main() {
float a;
int b;
a = 3.7f;
b = a + 10;
std::cout << b << std::endl;
return 0;
}
Passo 3
Explicando cada linha do programa, devagarinho:
#include <iostream>— traz a biblioteca que permite impressão no terminal comstd::cout.int main() { ... }— função principal do programa, onde o código é executado.float a;— declara a variávelado tipo ponto flutuante. No enunciadoera do tipo float.int b;— declara a variávelbdo tipo inteiro. No enunciadoera int.a = 3.7f;— atribui o valor literal3.7à variávela. Usei o sufixofpara indicar literalfloat(não é obrigatório, mas é bom estilo).- Em termos do enunciado, aqui foi feita a atribuição
.
- Em termos do enunciado, aqui foi feita a atribuição
b = a + 10;— calcula a expressãoa + 10e atribui o resultado ab. É aqui que entra a conversão implícita que o enunciado quer que observemos.std::cout << b << std::endl;— imprime o valor debseguido de nova linha.return 0;— indica que o programa terminou normalmente.
Passo 4
Vou explicar o que ocorre na expressão
b = a + 10; passo a passo, com calma:- Temos os operandos
e . é do tipo floate contém. é um literal inteiro ( int). - Na expressão aritmética entre
floateint, o compilador converte implicitamente ointparafloatpara que os dois operandos tenham o mesmo tipo — isso se chama promoção (ou conversão usual). Entãoé tratado como em ponto flutuante. - A soma é feita em ponto flutuante:
vira . - Agora ocorre a atribuição para
b, que é do tipoint. Converter um valor em ponto flutuante para um inteiro faz com que a parte fracionária seja descartada (ou seja, a conversão truncada). Em C++ isso resulta em truncamento em direção a zero.- Assim, ao converter
para int, o valor fica— a parte ,7é simplesmente removida.
- Assim, ao converter
- Portanto, depois de
b = a + 10;, temos.
Passo 5
Demonstração prática / teste mental:
-
. -
(soma em ponto flutuante). - Ao atribuir a
(inteiro), vira (truncamento). - O
std::cout << bimprime então o número.
Se você quiser ver também o valor da soma antes da conversão (para confirmar que a soma foi
), pode inserir:
std::cout << (a + 10) << std::endl; // imprime 13.7 (ou parecido, dependendo do formato)
Isso mostra que a soma em ponto flutuante realmente é
, e a diferença só aparece quando atribuímos ao
int.Passo 6
Observações importantes para a prova (coisas que frequentemente caem e valem anotar):
- Quando operar
floatcomint, ointé convertido parafloatantes da operação. - Quando atribuir um
floata umint, a parte fracionária é descartada (truncamento). Não há arredondamento automático. - Para evitar perda de informação, se você precisa do valor com casas decimais, mantenha a variável destino em
floatoudouble. - Se você quiser arredondar antes de converter, use funções como
std::round, por exemplob = static_cast<int>(std::round(a + 10));.
Resposta
A soma
foi feita em ponto flutuante; ao atribuir para
(tipo int) a parte fracionária foi descartada, resultando em
.