• C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.5 类型转换


    5.5 类型转换
    通常,在语句和表达式中应使用类型相同的变量和常量。如果,如果使用混合类型,C采用一套规则进行自动类型转换。虽然这很便利,但是有一定的危险性,尤其是在无意间混合使用类型的情况下(许多UNIX系统都使用lint程序检查类型“冲突”)。 
    1.当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会自动转换为int,如有必要会被转换成unsigned int(如果
    short与int的大小相同,unsigned short就比int大。这种情况下,unsigned short会被转换成unsigned int。在K&R那时的C中,float会被自动转换成double(目前的C不会这样)。由于都是从较小类型转换为较大类型,所以这些转换被称为升级(promotion)。
    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.在赋值表达式语句中,计算的最终结果会被转换成被复制变量的类型。这个过程可能导致类型升级或降级(demotion)。所谓降级,是指把一种类型转换成更低级别的类型。
    5.当作为函数参数传递时,char和short被转换成int,float被转换为double。第9章会介绍,函数原型会覆盖自动升级。
    类型升级通常不会有什么问题,但是类型降级会导致真正的麻烦。原因很简单:较低类型可能放不下整个数字。
    如果待转换的值与目标类型不匹配怎么办?这取决于转换涉及的类型。待赋值的值与目标类型不匹配时,规则如下。
    1.目标类型是无符号类型,且待赋值的值是整数时,额外的位将别忽略。
    2.如果目标类型是一个有符号类型,且待赋值的值是整数,结果因实现而异。
    3.如果目标类型是一个整型,且待赋值的值是浮点数,该行为是未定义的。
    如果把一个浮点值转换为整数类型,原来的浮点值会被阶段。
    /* convert.c -- automatic type conversions */
    #include
    int main(void)
    {
        char ch;
        int i;
        float fl;
        
        fl = i = ch = 'C';                                  /* line 9  */
        printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 10 */
        ch = ch + 1;                                        /* line 11 */
        i = fl + 2 * ch;                                    /* line 12 */
        fl = 2.0 * ch + i;                                  /* line 13 */
        printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 14 */
        ch = 1107;                                          /* line 15 */
        printf("Now ch = %c\n", ch);                        /* line 16 */
        ch = 80.89;                                         /* line 17 */
        printf("Now ch = %c\n", ch);                        /* line 18 */
        
        return 0;

    /* 输出:

    */

    5.5.1 强制类型转换运算符
    通常,应该避免自动类型转换,尤其是类型降级。然而,有时需要进行精确地类型转换,或者在程序中表明类型转换这种意图。这种情况下要用到强制类型转换(cast),即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。圆括号和它括起来的类型名构成了强制类型转换运算符(cast operator),其通用形式为:
    (type)
    用实际需要的类型替换type即可。
    int mice;
    mice = 1.6 + 1.7; //使用自动类型转换,结果为3
    mice = (int)1.6 + (int)1.7; //使用强制类型转换,结果为2
    本质上,两种类型转换都好不到那里去,要考虑程序的具体情况再做取舍。
    一般而言,不应该混合使用类型,但是偶尔这样做也是有用的。C语言的原则是避免给程序员设置障碍,但是程序员必须承担使用的风险和责任。
     

  • 相关阅读:
    【无标题】
    CSS三维倾斜
    文心一言 VS 讯飞星火 VS chatgpt (136)-- 算法导论11.3 2题
    第08章 第08章 图
    spring boot 整合多数据源
    lc--655:输出二叉树
    【无标题】
    C++STL详解(二)— string类模拟实现
    ESP32系列--第九篇 ADC的使用
    月薪2w+的测试,到底强在哪里?
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126196102