C++青少年简明教程:数据类型的转换
C++ 中,数据类型的转换是指将一个数据类型的值转换为另一个数据类型的值。转换可以是隐式的,也可以是显式的。
分析一个现象,运行下面的代码:
#include <iostream>
using namespace std;
int main() {
int fenshu;
cout << "请输入考试分数:";
cin >> fenshu;
cout << fenshu << endl;
return 0;
}
这段代码,输入85.7 也可以,但输出 85,参见下图:
为何?
fenshu 被声明为 int 类型,它只能存储整数值,而无法存储小数值。当你输入 85.7 时,cin 会将其解析为一个 double 类型的值——隐式类型转换,对C++而言这种类型转换是合法的,因此不会报错,只会造成精度损失。但是由于 fenshu 是 int 类型,所以会将其转换为整数值 85,并存储在 fenshu 中。
又如:
#include <iostream>
using namespace std;
int main() {
// 计算并打印 10/2
cout << 10/2 << endl;
return 0;
}
将cout << 10/2 << endl; 中的10/2改为10/4看看
运行代码,你发现什么了呢?是不是很奇怪?10/4:答案为什么不是2.5呢?
这是因为在C++里,我们用10和4相除,10和4都是整数,所以C++算出来的结果也是整数如果想显示小数的话,我们可以把10写成10.0,或者把4写成4.0,当然我们还可以把它们写成10.0/4.0,这样你可以看到,这时它们都是小数,所以得出的结果也是小数。
在C++里,整数运算结果得整数,小数运算结果得小数,小数和整数在一块混着运算,还是小数,这里其实是整数先转换成了小数,再参与运算,所以结果当然也是小数啦。
C++ 中,数据类型转换是指将一个数据类型的值转换为另一个数据类型的值。转换可以是隐式转换,也可以是显式转换。
☆自动转换/隐式转换
是指编译器自动将一个数据类型的值转换为另一个数据类型的值。
不同类型的数据进行运算,需先转换成同一类型;
转换按数据长度增加的方向进行,以保证精度不降低;
所有的浮点运算都是以双精度进行的;
char 型和 short 型参与运算时,必须先转换成 int 型;
char → short → int → long → unsigned long → double ← float
赋值号两边的数据类型不同时,右边的类型将转换为左边的。
转换规则
浮点型转整型:直接丢掉小数部分;
字符型转整型:取字符的 ASCII 码;
整型转字符型:取 ASCII 码对应的字符。
☆显式类型转换/强制类型转换
是指使用强制类型转换运算符,将一个数据类型的值转换为另一个数据类型的值。
早期的C风格的类型转换 (type)expression,如:
int a = 10;
double b = (double)a;
现代C++中,更推荐使用static_cast、dynamic_cast、const_cast和reinterpret_cast。以下是这四种显式转换操作符的示例:
- 静态转换(static_cast):
int a = 10;
double b = static_cast<double>(a); // 将整型转换为浮点型
- 动态转换(dynamic_cast):
class Base {
public:
virtual ~Base() {}
virtual void foo() {}
};
class Derived : public Base {};
int main() {
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 将基类指针转换为派生类指针
delete b;
return 0;
}
- 常量转换(const_cast):
const int a = 10;
int b = const_cast<int&>(a); // 去除const限定符
- 重新解释转换(reinterpret_cast):
int a = 0x1234;
char* p = reinterpret_cast<char*>(&a); // 将整型指针转换为字符型指针
上面有些例子涉及到尚未学到的知识,了解即可。
注意:无论是隐式转换还是显式转换,都需要谨慎使用,以避免数据丢失或意外的行为。