C

C 知识量:16 - 74 - 317

5.4 类型转换><

类型转换- 5.4.1 -

通常,在语句和表达式中应当使用类型相同的变量和常量。但是,如果使用混合类型,C语言将会采用一套规则进行自动类型转换,具体规则为:

  1. 当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与int大小相同,unsigned short就比int大。此时,unsigned short会被转换成unsigned int)。由于都是从较小的类型转换成较大的类型,所以这些转换被称为升级。

  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,float被转换成double。

强制类型转换运算符- 5.4.2 -

通常,应当避免自动类型转换,特别是类型降级。但是,有时需要手动进行精确的类型转换,这时可以使用强制类型转换运算符。具体做法是在要转换的量前面放置用圆括号括起来的类型名,该类型名就是希望转换成的目标类型。例如:

#include <stdio.h>

int main(void) {
    int x, y;
    x = 1.4 + 1.9;
    y = (int) 1.4 + (int) 1.9;
    printf("x=%d \n", x);
    printf("y=%d \n", y);
    system("pause");
    return 0;
}

运行结果为:

x=3
y=2

对于x的值,在完成1.4与1.9相加后进行了自动类型转换。而对于y的值,先对1.4和1.9进行强制类型转换再计算加法。