C语言学习第5篇---类型转换概念理解

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取

 

类型之间的转换

1.C语言中的数据可以进行转换

   ---强制类型转换

   ---隐式类型转换

 

强制类型转换

1.强制类型转换的语法

   ---(Type)var_name;

   ---(Type)value;

 

2.强制类型转换的结果

   ---目标类型能够容纳目标值,结果不变

   ---目标类型不能容纳目标值,结果将产生截断

 

注意:不是所有的强制类型转换都能成功,当不能进行强制转换时,编译器将产生错误信息

 

实现1;强制类型转换分析

#include 

struct TS

{

    int i;

    int j;

};

struct TS ts;

int main()

{

    short s = 0x1122;

   

    char c = (char)s;    // 0x22

   

    int i = (int)s;      // 0x00001122

   

    int j = (int)3.1415; // 3

   

    unsigned int p = (unsigned int)&ts;

   

    long l = (long)ts;   // error

   

    ts = (struct TS)l;   // error

   

    printf("s = %x\n", s);

    printf("c = %x\n", c);

    printf("i = %x\n", i);

    printf("j = %x\n", j);

    printf("p = %x\n", p);

    printf("&ts = %p\n", &ts);

   

    return 0;

}

 

 

隐式类型转换

   ---编译器主动进行的类型转换

 

注意:低类型到高类型的隐式转换是安全的,不会产生截断

          高类型到低类型的隐式转换时不安全的,到是不正确的结果

 

 

 

表达式的隐式转换转换

1.隐式类型转换的发生点

   ---算术运算中,低类型转换为高类型

   ---赋值表达式中,表达式的值转换为左边变量的类型

   ---函数调用时,实参转换为形参的类型

   ---函数返回值,return表达式转换为返回值类型

C语言学习第5篇---类型转换概念理解_第1张图片

 

 

实验2:隐式类型转换分析

#include 

int main()

{

    char c = 'a';

   

    int i = c;    // safe

   

    unsigned int j = 0x11223344;// 占用四个字节的整型数

   

    short s = j;  // unsafe

   

    printf("c = %c\n", c);

    printf("i = %d\n", i);

    printf("j = %x\n", j);

    printf("s = %x\n", s);

    printf("sizeof(c + s) = %d\n", sizeof(c + s));

   

    return 0;

}

 

 

小结:

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

   ---转换可能产生截断

   ---转换不区分类型的高低

   ---转换不成功时,编译器给出错误信息

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

   ---低类型由高类型的转换是安全的

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

 

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

 

 

 

 

你可能感兴趣的:(C语言深度剖析学习总结)