美文网首页
C 笔记十七 类型转换

C 笔记十七 类型转换

作者: 吃柠檬的鸮 | 来源:发表于2019-05-09 23:38 被阅读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

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

    相关文章

      网友评论

          本文标题:C 笔记十七 类型转换

          本文链接:https://www.haomeiwen.com/subject/pscnoqtx.html