C语言:隐式的算术类型转换

如果二元运算符(具有两个操作数的运算符称为二元运算符,比如+*)的两个操作数具有不同的类型,那么在进行运算之前先要把“较低”的类型提升为较高的类型。运算的结果为较高的类型。

如果没有 unsigned 类型的操作数,则只要使用下面这些非正式规则就可以了:

  1. 如果其中一个操作数的类型为 long double,则将另一个操作数转换为 long double 类型;
  2. 如果其中一个操作数的类型为 double,则将另一个操作数转换成 double 类型;
  3. 如果其中一个操作数的类型为 float,则将另一个操作数转换为 float 类型;
  4. 将 char 与 short 类型的操作数转换为 int 类型;

注意,表达式中 float 类型的操作数不会自动转换为 double类型,这一点与最初的定义有所不同。

当表达式中包含 unsigned 类型的操作数时,转换规则要复制一些。。。。。

赋值时也要进行类型转换。复制运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。

无论是否进行符号拓展,字符型变量都将被转换为整形变量。

当把较长的整数转换为较短的整数或char类型时,超出的高位部分将被丢弃,例如:

int i;
char c;
i=c
c=i

执行后,c的值将保持不变。无论是否进行符号拓展,该结论都成立。但是,如果把两个复制语句的次序颠倒一下,则执行后可能会丢失信息。

如果 x 是 float 类型,i 是 int 类型,那么语句 x=1 与 i=x 在执行时都要进行类型转换。
当把 float 类型转换为 int 类型时,小数部分将被截取调;
当把 double 类型转换为 float 类型时,是进行四舍五入还是截取取决于具体的实现。

函数调用

由于函数调用的参数是表达式,所以在把参数传递给函数时也可能进行类型转换。在没有函数原型的情况下,char 与 short 类型都将被转换为 int 类型,float 类型将被转换为 double 类型。因此,既是调用函数的参数为 char 或 float 类型,我们也把函数参数声明为 int 或 double 类型。