引言
不同的数据在计算机内存中的存储方式不同,导致了“类型”这一抽象概念的出现。
对于一个变量而言,其必须要回答三个问题:
1. 在哪可以访问到这个变量的起点?
2. 从起点向后需要读取多少内存?
3. 应该如何解析读取到的二进制数据?
上述的三个问题中,问题 1,由内存地址回答,问题 2 和 3,均由类型回答。
由此可见,类型与内存地址共同构成了一个变量的完整组分。之所以不能对 void 取值,也是由于无法回答问题 2 和 3 导致。
进一步的,我们可以得到一条十分重要的结论:对于两个不同类型的变量,由于其对问题 2 和 3 的答案不同,故如果将这样的两个变量直接进行运算,在绝大多数情况下都将无法产生有价值的计算结果。
故在几乎所有的编程语言中都有一条重要的规定:不同类型的两个变量无法直接进行运算。
虽然不同类型的两个变量无法进行运算,但显然,我们可将其中的一个变量通过类型转换,转为与另一个变量类型一致,此时就满足“同类型变量才能进行运算”这一规定了。
同时,由于某些类型转换是“理所应当”的,而另一些不是,故由此又派生出两个概念:隐式类型转换与显式类型转换。
隐式类型转换指不通过专门的类型转换操作,而是通过其它规定或代码上下文隐式发生的类型转换,而显式类型转换则通过专门的类型转换操作进行转换,显式类型转换具有强制性,其将不受任何类型转换以外的因素影响,故显式类型转换又称为强制类型转换 。
在 C++ 中,类型转换是一个非常复杂的话题。本文将先从隐式类型转换入手,逐步讨论各类 C++ 的类型转换话题。
类型提升与算术类型转换
算术类型转换专指 C++ 提供的各种内置算术类型之间的隐式类型转换。
内置算术类型主要包括以下类型:
1. bool
2. char, signed char, unsigned char
3. short, int, long, long long, unsignedshort, unsigned int, unsigned long, unsigned long long
4. float, double, long double
5. size_t, ptrdiff_t, nullptr_t 等其它特殊类型
算术类型转换是一类不完全明确的,且与底层密切相关的隐式类型转换。
其遵循以下几条主要原则:
1. 对于同类算术类型,如short 与 int,float 与 double,占用较小内存的类型将转换成另一类型。如 short+ int将被转换为 int + int。此种类型转换称为类型提升。
2. 整形将转为浮点型。如 int+ double 将被转换为 double + double。
3. 仅当无符号类型占用的内存小于有符号类型时,无符号类型才发生类型提升从而转为有符号类型,否则,有符号类型将转为无符号类型。这是一个非常需要注意的点。
参考以下代码:
int main
{
unsignedshorta = 1