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编译器的类型检查比较宽松,因此隐式类型转换可能带来意外的错误。