在此之前,您了解到一个变量的值被存储为一个位的序列,而变量的数据类型告诉编译器如何将这些比特转换成有意义的值。不同的数据类型可以不同地表示“相同的”号,例如,整数值3和浮点数3被存储为完全不同的二进制模式。
在所有这些情况下(不少人),C++将使用类型转换将数据转换为另一种类型。
类型转换有两种基本类型:隐式类型转换,编译器自动将一个基本数据类型转换成另一个基本数据类型,而显式类型转换,其中,开发人员使用一个铸造操作符来直接转换。
我们将在这个教训中覆盖隐式类型转换,然后在下一个。
隐式类型转换
隐式类型转换(也被称为自动类型转换或强制)是每当一个基本的数据类型,但提供一个不同的基本数据类型,用户并没有明确告诉编译器如何执行这种转换(通过演员)。
以上所有的例子都是隐式类型转换的情况下使用的。
有两种基本类型的隐式类型转换:促销和转换。
数字提升
当一个值从一个类型转换成一个更大的类似数据类型的值,这被称为一个数字提升(或扩大,虽然这个术语通常是保留整数)。例如,int可以发展成长,或浮升到一个双:
算术表达式求值
当评估表达式,编译器将每个表达为单独的子表达式。算术运算符要求它们的操作数为同一类型。如果使用混合类型的操作数,编译器将隐式地转换一个操作数,使用一个称为通常的算术转换的过程来同意另一个操作数。要做到这一点,它使用以下规则:
如果操作数是一个整数,它经历了整数提升(如上所述)。
如果操作数仍然不匹配,则编译器会查找最高优先级的操作数,并将其他操作数转换为匹配的操作数。
那么,当我们做这样的事情时会发生什么呢?
void doSomething(long l)
{
}
doSomething(3); // pass integer value 3 to a function expecting a long parameter
在所有这些情况下(不少人),C++将使用类型转换将数据转换为另一种类型。
类型转换有两种基本类型:隐式类型转换,编译器自动将一个基本数据类型转换成另一个基本数据类型,而显式类型转换,其中,开发人员使用一个铸造操作符来直接转换。
我们将在这个教训中覆盖隐式类型转换,然后在下一个。
隐式类型转换
隐式类型转换(也被称为自动类型转换或强制)是每当一个基本的数据类型,但提供一个不同的基本数据类型,用户并没有明确告诉编译器如何执行这种转换(通过演员)。
以上所有的例子都是隐式类型转换的情况下使用的。
有两种基本类型的隐式类型转换:促销和转换。
数字提升
当一个值从一个类型转换成一个更大的类似数据类型的值,这被称为一个数字提升(或扩大,虽然这个术语通常是保留整数)。例如,int可以发展成长,或浮升到一个双:
2
3
4
5
6
7
8
9
int main()
{
int i = 30000;
char c = i;
std::cout << static_cast<int>(c);
return 0;
}
算术表达式求值
当评估表达式,编译器将每个表达为单独的子表达式。算术运算符要求它们的操作数为同一类型。如果使用混合类型的操作数,编译器将隐式地转换一个操作数,使用一个称为通常的算术转换的过程来同意另一个操作数。要做到这一点,它使用以下规则:
如果操作数是一个整数,它经历了整数提升(如上所述)。
如果操作数仍然不匹配,则编译器会查找最高优先级的操作数,并将其他操作数转换为匹配的操作数。