第 5 课:强制类型转换
强制类型转换是将一个数据类型的值转换为另一个数据类型的操作。
在 C++ 中,不同的数据类型有不同的表示范围、存储方式和操作规则。当需要将一种类型的数据当作另一种类型来处理时,就可能用到强制类型转换。
例如,把一个整数转换为浮点数,或者把一个浮点数转换为整数。
但它只是一种临时的转换,并不会改变这个变量原来的类型。
转换格式
格式:(数据类型)(表达式)
即:(要被转换成的类型)(被转换的式子)
需要注意的是,数据类型或者表达式至少要有一个被括号括起来。
5.1 整型转换成浮点型
我们先来学习如何将一个整数转换为浮点数。例如现在要输出 5/2 的结果,如果直接输出,由于整数 / 整数得到的结果会截断小数部分,所以结果为 2。
若现在想要得到小数结果,则可以这么写:
int a = 5;
cout << (double)a / 2;这么写就相当于先把 a 转化成 double 类型的浮点数,再让这个浮点数除以 2,相当于浮点数 / 整数,得到的结果自然也是浮点数。
但需要注意的是,这里的 a 只是临时转化成浮点型,下次再正常使用变量 a 时,a 依然是整型。
整型转换成浮点型的其他写法
把整型变量 a 转换成浮点型,除了 (double)a 这种写法外,还有其他两种写法,分别是
double(a)和
(double)(a)通过上面三种写法可以看出,要想把整型变量 a 转换成 double 类型的浮点数,在 a 或者 double 外至少要有一对小括号。
此时蛙蛙做了另外一个操作,他是这样写的:
int a = 5;
cout << double(a / 2);编译运行后,发现结果是 2,你知道这是为什么吗?
这是因为程序在运行时,先运行的是小括号里面的 a / 2。a 和 2 均为整数,所以算出来的结果为 2,再将这个结果 2 转换为浮点数,依然是 2。
5.2 实例讲解一
例 1:糖果奖励
氪町博士准备了一些糖果分给班里比较优秀的学生,蛙蛙自然也是其一。
已知氪町博士一共买了 n 斤糖果,准备将这 n 斤糖果平均分给蛙蛙以及其余 4 个在本学期取得优异成绩的学生。
买糖果的时候,氪町博士发现商场正在做活动,买 n 斤还送一斤,请问最终每位同学能分到多少斤糖果呢?
【输入格式】输入一行,一个正整数 n。
【输出格式】输出一行,为每位取得优异成绩的学生平均分得的糖果斤数,输出结果为浮点数。
【输入样例】7
【输出样例】1.6
解析
输入:由于 n 为正整数,所以需要声明一个整型变量 n,然后通过
cin >> n语句输入一个值,例如 7,那么此时 n 的值为 7。计算每位同学分到的糖果斤数:由于商场在做活动,买 n 斤还送一斤,所以糖果的总斤数实际为 n + 1 斤。人数包括蛙蛙在内一共为 4 + 1 = 5 人。但如果直接使用 (n + 1) / 5 进行计算,由于 n 和 5 均为整数,所以得到的结果也为整数,比如当 n = 7 时,(7 + 1) / 5 得到的结果为 1,因为小数点后面的数均被截断了。
若想计算出带浮点数的结果,可以先将 n + 1 的结果强制转换为浮点数,再除以 5,即 (double)(n + 1) / 5,则可得到正确的带浮点数的结果。
- 输出:最后再输出算得的浮点数结果即可。
参考代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << double(n + 1) / (1 + 4);
return 0;
}例 2:棒棒糖奖励
氪町博士还准备买 m 个棒棒糖分给本学期进步较大的两位学生,有两种方法:一种是将单个棒棒糖掰开来平分;另一种是平分完整的棒棒糖,剩余的氪町博士自己留着吃。
按这两种分法,这两位学生分别能获得多少个棒棒糖?
【输入格式】输入一行,一个正整数 m,表示棒棒糖的数量。
【输出格式】输出一行,为按两种方式分得的棒棒糖,用空格隔开。
【输入样例】7
【输出样例】3.5 3
解析
首先声明整型变量 m,再通过
cin >> m语句获取用户输入的棒棒糖数量。对于第一种分法,要将单个棒棒糖掰开来平分,也就是将总的棒棒糖数量 m 以浮点数除法的形式除以 2,即通过
(double)m / 2,先将 m 强制转换为 double 类型,这样除法运算就会得到包含小数部分的结果,对应两位学生平分后各自能得到的数量。对于第二种分法,平分完整的棒棒糖,这里使用整数除法 m / 2,它会自动舍去小数部分,得到完整分给两位学生的棒棒糖数量,剩余的部分(剩余可能为 0)就留给氪町博士自己了。
最后通过 cout 语句按照要求的格式输出两种分法下学生分别得到的棒棒糖数量,用空格隔开,然后程序结束并返回 0,表示正常退出。
参考代码
#include <iostream>
using namespace std;
int main()
{
int m;
cin >> m;
cout << double(m) / 2 << " " << m / 2;
return 0;
}5.3 浮点型转换成整型
在氪町博士的指导下,蛙蛙已经学会了如何将整型转换成浮点型。但对于浮点型转换成整型,他还是不清楚应该如何写。氪町博士告诉他格式与整型转浮点型一致,并举了下面的例子。
例如输出 5.5 / 2 的整数结果,可以这么写:
double a = 5.5;
cout << (int)a / 2;需要注意的是,把 double 变成 int 进行的操作是取这个数的整数部分,因此不管小数部分是多少,都只要整数部分,如 (int)9.9 = 9。
浮点型转换成整型也是临时的转换,并不会改变变量本身的类型。
浮点型转换成整型的其他写法
把浮点型变量 a 转换成整型,除了 (int)a 这种写法外也有其他两种写法,分别是:
int (a)和
(int)(a)通过上面三种写法也可以看出,要把浮点型变量 a 转换成整型,在 a 或者 int 外也至少要有一对小括号。
5.4 实例讲解二
例 3:蛙蛙买饼
蛙蛙的妈妈早上有些不舒服,懂事的蛙蛙决定为妈妈分担家务,主动去买早餐。
蛙蛙在早餐店买了 n 张饼,但回来的路上蛙蛙又饿又馋,一时没忍住就先吃了半张饼。回家后,蛙蛙及爸爸妈妈还能平均分得几张完整的饼呢?
【输入格式】输入一行,一个正整数 n,表示蛙蛙买的饼的数量。
【输出格式】输出一行,一个整数,表示每个人能分得的完整饼数。
【输入样例】9
【输出样例】2
解析
首先声明变量 n,然后使用 cin 从标准输入读取蛙蛙买的饼的数量 n。
接着,计算蛙蛙吃了半张饼后,三人分得的剩余的完整饼数。需要先将饼的数量减去 0.5,再除以 3。
最后通过强制类型转换
int(计算公式)将结果保留整数部分即可。
参考代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << int((n - 0.5) / 3);
return 0;
}例 4:分离小数
蛙蛙遇到一个数,他现在想获取这个数的整数部分和它的小数部分,应该如何处理呢?
【输入格式】输入一行,一个浮点数 a。
【输出格式】输出一行,两个数,分别是这个数的整数部分和小数(整数位为 0)部分,并且用空格隔开。
【输入样例】12.34
【输出样例】12 0.34
解析
首先,声明一个浮点型变量 a,再使用 cin 从标准输入读取一个浮点数 a。
然后,通过将浮点数 a 强制转换为整数,得到其整数部分。
接着,用 a 减去其整数部分,即可计算出小数部分。
最后,使用 cout 输出整数部分和小数部分,用空格隔开。
参考代码
#include <iostream>
using namespace std;
int main()
{
double a;
cin >> a;
cout << (int)a << " " << a - (int)a;
return 0;
}