C语言进阶——类型转换04

C语言内可以进行类型转换:

  • 强制类型转换
  • 隐式类型转换

强制类型转换的语法:

  • (tpye)value
  • (type)value_name

强制类型转换的结果:

  • 目标类型可以容纳目标值:结果不变
  • 目标值不要能容纳目标值:结果将产生截断
  • 注意:不是所有的强制类型转换都可以成功,当不能进行强制类型转换的时候,编译器将产生错误信息

示例代码1:

  •  1 #include <stdio.h>
     2 
     3 struct TS
     4 {
     5     int i;
     6     int j;
     7 };
     8 
     9 struct TS ts;
    10 
    11 int main()
    12 {
    13     short s = 0x1122;
    14     
    15     char c = (char)s;    // 0x22
    16     
    17     int i = (int)s;      // 0x00001122
    18     
    19     int j = (int)3.1415; // 3
    20     
    21     unsigned int p = (unsigned int)&ts;
    22     
    23     long l = (long)ts;   // error
    24     
    25     ts = (struct TS)l;   // error
    26     
    27     printf("s = %x\n", s);
    28     printf("c = %x\n", c);
    29     printf("i = %x\n", i);
    30     printf("j = %x\n", j);
    31     printf("p = %x\n", p);
    32     printf("&ts = %p\n", &ts);
    33     
    34     return 0;
    35 }

    直接赋值这段代码在23行和25行会产生错误,自定义类型不可以和传统类型进行强制类型转换

隐式类型转换:

  • 编译器主动进行的转换
  • 注意:低类型到高类型的隐式转换时安全的,不会产生截断;高类型到低类型的隐式转换是不安全的,导致不正确的结果

隐式类型转换的发生点:

  • 算数运算中,低类型转换为高类型
  • 赋值表达式中,表达式的值转换为左边的类型
  • 函数调用的时候,实参转换为形参的类型
  • 函数返回值,return表达式转换为返回值类型

下图是隐式类型转换的模式:

  • 当char类型和short进行运算时,会先隐式转换为int类型
  • 同样其他类型做运算时,都会按照图中的安全类型进行转换

示例代码2:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     char c = 'a';
 6     
 7     int i = c;    // safe
 8     
 9     unsigned int j = 0x11223344;
10     
11     short s = j;  // unsafe
12     
13     printf("c = %c\n", c);
14     printf("i = %d\n", i);
15     printf("j = %x\n", j);
16     printf("s = %x\n", s);
17     printf("sizeof(c + s) = %d\n", sizeof(c + s));
18     
19     return 0;
20 }

总结:

强制类型转换由程序员负责完成:

  • 转换可能产生截断
  • 转换不区分类型的高低
  • 转换不成功时,编译器给出错误信息

 隐式类型转换由编译器自动完成:

  • 低类型向高类型的转换时安全的
  • 高类型向低类型的转换是不安全的

注意:标准C编译器的类型检查比较宽松,因此隐式类型转换可能带来意外的错误。

posted @ 2018-06-19 22:07  清浅...忆回  阅读(272)  评论(0编辑  收藏  举报