一般来说,自动转换是指把 “ 比较窄的” 操作数转换为 “ 比较宽 ” 的操作数,并且不丢失信息的转换。
例如一个运算符的几个操作数类型不同时,需要把它们转换为某种共同的类型。
int i = 2;
float f = 3.14;
float res = i + f; // 将整型变量 i 的值自动转换为浮点型,再计算表达式的值
需要注意的是,把较大的值赋值给较小的类型并不是非法的,但是会导致信息丢失,例如把上面的 f
赋值给 i
,将导致精度丢失,编译器对此类操作可能会给出警告。
char
类型作为较小的整型,可以再算术表达式中自由使用,利用这一特性,可以使用 char
类型的变量来实现某些字符的转换。
// 将一串数字转换为相应的数值
int atoi(char s[]) {
int i, n;
n = 0;
for (i = 0; a[i] >= '0' && s[i] <= '9'; ++i)
n = n * 10 + (a[i] - '0');
}
一般情况下,如果表达式中没有 unsigned
操作数,则使用下面这些非正式的规则就足够了:
- 如果其中一个操作数的类型为
long double
,则将另一个操作数转换为long double
; - 如果其中一个操作数的类型为
double
,则将另一个操作数转换为double
类型; - 如果其中一个操作数的类型为
float
,则将另一个操作数转换为float
类型; - 将
char
与short
类型的操作数转换为 int 类型; - 如果其中一个操作数的类型为
long
,则将另一个操作数也转换为long
类型。
有一个例外是,表达式中的 float
类型操作数不会自动转换为 double
类型。使用 float
类型主要是为了在使用较大的数组时节省存储空间,有时也为了节省机器执行时间。
如果表达式中存在 unsigned
类型的操作数,由于带符号值和无符号值之间的比较运算是机器相关的,因此它们取决于机器中不同整数类型的大小。
无论是否进行符号扩展,字符型变量都将被换成整型变量。
在任何表达式中都可以使用 强制类型 转换进行显式类型转换:
(TYPENAME) expression
强制类型转换运算符与其他一元运算符具有相同的优先级。
网友评论