注意:以下内容摘自文献[1],修改了部分内容。
1.运算中各类型数据转换方向如下:
高 | double | ← | float |
↑ | ↑ | ||
| | long | ||
| | ↑ | ||
| | unsigned | ||
| | ↑ | ||
低 | int | ← | char, short |
其中,横向的箭头表示必定的转换,即使是两个char型的数据相加减,每个数都先转换为int,然后在运算;纵向箭头表示当运算对象为不同类型时转换的方向。例如int型与double数据进行运算时,先将int型转换为double型,然后在两个double型数据间进行运算,结果为double型。 P31[1] (从取值范围来看,刚好是从小到大)
2.下面一个例子:
// 20191009.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
system("color 3f");
char a = 10;
int b = 3;
cout << "type(a):" << typeid(a).name() << endl;
cout << "type(b):" << typeid(b).name() << endl;
cout << "type(a+b):" << typeid(a + b).name() << endl;
a += b;
cout << "a += b; type(a):" << typeid(a).name() << endl;
double c;
cout << "type(c):" << typeid(c).name() << endl;
c = a + b;
cout << "c = a + b; type(c):" << typeid(c).name() << endl;
system("pause");
return 0;
}
运行结果如图:
(1) 在a是char型,b是int型,执行“a+b”时,必然发生将char型和float型转换成int型,而a和b中取值范围最大的是int,所以执行“a+b”相当于执行“int(a) + int(b)”,结果是int型;
(2) a += b 相当于a = a + b;由于赋值运算符“=”优先级小于算术运算符“+”,故 先执行“a+b”(优先级大小可查阅~ 【C++】运算符优先级和结合性),“a+b”上面已经得到,其结果是int型,接下来进行赋值运算由于a是char型,但是a+b结果是int型,故将int型数据赋值给char型数据,在VC++ 6.0中,char占一个字节,int型占4个字节,故将(a+b)的低8位赋值给char型的a,注意此时将取值范围大的变量赋值给取值范围小的变量有可能发生“截断”或者“溢出”。(赋值过程中的类型转换可查阅~【C++】赋值过程中的类型转换)
(3) 同样的,=优先级低于+,故先执行算术运算,int型的(a + b) 赋值给double型的c,取值范围小的赋值给取值范围大的,不会发生“截断”。
注意:执行赋值运算时,可考虑变量在内存中存储的二进制数,即将二进制赋值给其他变量,这样就比较好理解。
参考文献
[1]谭浩强.C++程序设计[M].北京:清华大学出版社.