3

【C进阶】4、类型之间的转换

 3 years ago
source link: https://segmentfault.com/a/1190000040437887
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Summary

0)工程中需要避免隐式转换,强转有时无法避免,但一定要时刻注意操作的数据的类型,对操作的数据的类型要十分明晰,对转换的结果也要十分明晰。

1)C语言中有强制类型转换隐式类型转换

2)强制类型转换的语法为:(Type)var;
强制类型转换的结果为:

  • 目标类型能够容纳目标值:结果不变
  • 目标类型不能容纳目标值:结果将产生截断(截断只会保留低地址的字节)(对于整型值,和第2节中总结的整型值溢出运算结果一致)
  • 浮点数到整型数的强转会直接舍去小数位
  • 不是所有的强转都能成功,如果无法成功强转,编译器会报错

3)隐式类型转换指的是:编译器主动进行的转换。标准C编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误(如高类型向低类型转换会发生截断)。

4)隐式类型转换的发生点

  • 算术运算式中,低类型转换为高类型(char和short进行算术运算时,全都会先转换为int)
  • 赋值时,表达式的值转换为左边变量的类型
  • 函数调用时,实参转换为形参的类型
  • 函数返回值,return表达式转换为返回值类型

C语言中的强制类型转换

  • 强制类型转换

    long l = 50;
    int i = (int)l;   // 强制类型转换,long --> int
  • 隐式类型转换

    short s = 800;
    int i = s;   // 隐式类型转换,short --> int
                 // no error, no warning

1、强制类型转换

强制类型转换的语法:

  • (Type)var_name;
  • (Type)value;

强制类型转换的结果:

  • 目标类型能够容纳目标值:结果不变
  • 目标类型不能容纳目标值:结果将产生截断截断只会保留低地址的字节
  • 注意:并不是所有的强制类型转换都能成功,如果不能强制类型转换时,编译器会报错

    short s = 256;     // 256的16进制表示:0x 0 1 0 0
    char c = (char)s;  // 发生截断,只保留低地址的字节,
                       // 即c的值为:0x00, c = 0

示例详解:

struct TS
{
    int i;
    int j;
};

struct TS ts;

int main()
{
    short s = 0x1122;

    char c = (char)s;  // short类型到char类型的转换,有溢出,产生截断,只保留低地址的字节

    int i = (int)s;   // short类型到int类型的转换,不会溢出,无风险

    int j = (int)3.1415;   // 浮点数到整形的转换,直接舍去小数部分

    unsigned int p = (unsigned int)&ts;

    long l = (long)ts;  // error,从结构体类型到long类型无法强转

    ts = (struct TS)l;  // error

    
    printf("s = 0x%x\n", s);  // 0x1122
    printf("c = 0x%x\n", c);  // 0x22
    printf("i = 0x%x\n", i);  // 0x1122
    printf("j = 0x%x\n", j);  // 0x3
    printf("p = 0x%x\n", p);  // 0x804a01c
    printf("&ts = %x\n", &ts);// 0x804a01c

    return 0;
}

2、隐式类型转换

隐式类型转换指的是:编译器主动进行的类型转换

  • 注意:低类型到高类型的隐式转换是安全的,不会产生截断
  • 注意:高类型到低类型的隐式类型转换是不安全的,导致不正确的结果

    char c = 0;   // 变量c占用1个字节,字面量0的类型是int,int到char的隐式类型转换
    short s = c;  // c到s隐式类型转换
    int i = s;    // s到i隐式类型转换
    long l = i;   // i到l隐式类型转换

隐式类型转换的发生点:

  • 算术运算式中,低类型转换为高类型(char和short进行算术运算时,全都会先转换为int)
  • 赋值时,表达式的值转换为左边变量的类型
  • 函数调用时,实参转换为形参的类型
  • 函数返回值,return表达式转换为返回值类型

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK