#M8208. 类型转换

类型转换

什么是类型转换?


例:把10个苹果均分给4个小朋友,不能切开得情况,每个小朋友分到几个苹果呢?

答案是2个。 C++语言在计算 10 / 4 时直接得到它们的商2,但是如果表达式写为10 / 4.0,则得到结果2.5.这是因为表达式变成了一个整型和浮点型之间的除法,其结果也是浮点型。

类型转换提供了将一种数据类型转换为另一种数据类型的方式。类型转换可以通过自动类型转换和强制转换来实现。

自动类型转换


隐式转换在编写代码时不需要显式地进行转换,而是由编译器自动完成的。

  • 赋值运算中的自动转换:如果赋值运算符两侧的类型不一致,在赋值时会进行自动类型转换。

  1. 将浮点型数据赋值给整型变量时,舍弃浮点数的小数部分。
int i = 8.24; // i 的值为 8,在内存中以整数形式保存

  1. 将整型赋值给浮点型变量时,数值不变,但以浮点数的形式存储到变量中。
float f = 35; //先将 35 转换成 35.00000,再存储到 f 中。
double d = 35; //则将 35 转换成 35.00000000000000,然后以双精度浮点数形式存储到 d 中

  1. 将字符型数据赋值给整型变量时,由于字符只有1个字节,因此将字符数据放到整型变量的低八位中。
int i = 'a'; // i 的值为 97,在内存中以整数形式保存

  1. 将其他整形变量赋值给char型变量时,只将其低8位原封不动地送到char型变量(高位截断)。
char c = 289; //以 %d 形式输出,c 的值为 33,以 %c 形式输出,得到字符 '!'(其ASCII码值为 33)的值为 33,以 %c 形式输出,得到字符 '!'

  • 算术表达式的自动类型转换:在算术表达式进行运算的过程中,不同类型的数据要自动转换成同一类型再进行运算。
#include <iostream>
using namespace std;
int main()
{
	char c = 'a';
    int i = 3;
	double d = 3.14;
    cout << c + i + d << endl; //103.14
  	return 0;
}



强制类型转换


显式转换需要在代码中明确地指定要进行的类型转换。

#include <iostream>
using namespace std;

int main() {
    double f = 5.5;
    double z = (int)f;
    printf("%lf", z); 
    return 0;
}

代码运行后的值为5.000000,和你想的一样吗?

首先将5.5赋值给了double类型变量f。接下来将变量f的值强制类型转换为整型(舍弃了小数部分,变为5)再赋值给一个浮点型。最后通过printf输出,默认显示6位小数,所以结果为5.000000。

程序中的 (int) 就是强制类型转换。