关于c:C进阶4类型之间的转换

22次阅读

共计 1595 个字符,预计需要花费 4 分钟才能阅读完成。

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 语言进阶课程》。
如有错漏之处,恳请斧正。

正文完
 0