C 笔记十七 类型转换

2019-05-09  本文已影响0人  吃柠檬的鸮

一般来说,自动转换是指把 “ 比较窄的” 操作数转换为 “ 比较宽 ” 的操作数,并且不丢失信息的转换。
例如一个运算符的几个操作数类型不同时,需要把它们转换为某种共同的类型。

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 操作数,则使用下面这些非正式的规则就足够了:

  1. 如果其中一个操作数的类型为 long double,则将另一个操作数转换为 long double
  2. 如果其中一个操作数的类型为 double,则将另一个操作数转换为 double 类型;
  3. 如果其中一个操作数的类型为 float,则将另一个操作数转换为 float 类型;
  4. charshort 类型的操作数转换为 int 类型;
  5. 如果其中一个操作数的类型为 long,则将另一个操作数也转换为 long 类型。

有一个例外是,表达式中的 float 类型操作数不会自动转换为 double 类型。使用 float 类型主要是为了在使用较大的数组时节省存储空间,有时也为了节省机器执行时间。

如果表达式中存在 unsigned 类型的操作数,由于带符号值和无符号值之间的比较运算是机器相关的,因此它们取决于机器中不同整数类型的大小。

无论是否进行符号扩展,字符型变量都将被换成整型变量。

在任何表达式中都可以使用 强制类型 转换进行显式类型转换:

(TYPENAME) expression

强制类型转换运算符与其他一元运算符具有相同的优先级。

上一篇下一篇

猜你喜欢

热点阅读