1、当出现在表达式里时,有符号和无符号的char和short类型都将被自动转换为int,在需要的情况下,将自动被转换为unsigned int。在K&RC下,但不是在当前的C下,folat将被自动转换为double.因为是转换成较大的类型,所以这些转换被称为提升。
2、在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别。
3、类型从高到低的顺序是:long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int 、int。一个可能是例外是当long和int具有相同的大小时,此时unsigned int比long的级别更高。之所以short和char类型没有出现在此清单里,是因为他们已经被提升为int或也可能被提升为unsigned int。
4、在赋值语句里,计算的最后结果将被转换成将要被赋于值的那个变更的类型。
5、当被作为函数的参数传递时,char和short会被转换为int,folat会被转换为double。
提升通常是一个平滑的无损害的过程,但是降级可能导致真正的问题。原因很简单,一个较低级别的类型可能不够大,不能存放一个完整的数。
程序清单5.14 convert.c
/*convert.c --自动类型转换*/
#include <stdio.h>
int main ()
{
char ch ;
int i;
float fl;
fl = i = ch = 'C'; /*9 */
printf("ch = %c, i = %d, fl = %2.2f\n",ch,i,fl); /*10*/
ch = ch+1; /*11*/
i=fl + 2*ch; /*12*/
fl= 2.0*ch + i; /*13*/
printf("ch = %c, i = %d,fl = %2.2f\n",ch ,i ,fl); /*14*/
ch=5212205.17;
printf("Now ch = %c\n",ch);
return 0 ;
}
下面是在8位char,32位int的系统上运行程序的过程分析:
9和10:字符‘C‘被作为1字节的ASCII值存储在ch里。整数变量i接受由’C‘转换成的整数,即67,它以4字节存储。最后,fl接受由67转换成的浮点数,即67.00.
11和14行:字符变量’C‘被转换成整数67,然后把该整数加1.结果的4字节整数68被截为1字节并存储在ch里。当使用%c说明符进行打印时,68被解释为’D‘的ASCII码。
12和14行:为了和2相乘,ch的值被转换为一个4字节的整数68.乘积整数136为了和fl相加而被转换为浮点类型。结果203.00f被转换成int类型并存储在i中。
13和14:为了和2.0相乘,ch的值('D',即68)被转换为浮点类型。为了做加法,i值(203)被转换为浮点类型。结果(339.00)被存储在fl中。
15和16:在这里,示例程序尝试了一个降级。把ch设置为一个很大的数。在截去高位后,ch最终变成了连字符这一字符 的ASCII码。
指派运算符
到目前为止我们讨论的类型转换是自动完成的。然而,您也可能需要 准确的类型,或者需要在程序中表明您是知道您正在做类型转换的。完成这一任务的方法被称为指派(cast),其步骤是在某个量的前面放置用圆括号括起来的被希望转换成的类型名。圆括号和类型名一起构成了指派运算符。其一般形式如下:(type)
来源:oschina
链接:https://my.oschina.net/u/2754880/blog/678858