【C进阶】4、类型之间的转换
Summary
0)工程中需要避免隐式转换,强转有时无法避免,但一定要时刻注意操作的数据的类型
,对操作的数据的类型要十分明晰,对转换的结果也要十分明晰。
1)C语言中有强制类型转换
和隐式类型转换
2)强制类型转换的语法为:(Type)var
;
强制类型转换的结果为:
- 目标类型
能够容纳
目标值:结果不变
- 目标类型
不能容纳
目标值:结果将产生截断
(截断只会保留低地址的字节
)(对于整型值,和第2节中总结的整型值溢出运算结果一致) - 浮点数到整型数的强转会
直接舍去小数位
不是所有的强转都能成功
,如果无法成功强转,编译器会报错
编译器主动进行的转换
。标准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
(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;
// errorprintf("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);
// 0x804a01creturn 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表达式转换为返回值类型
如有错漏之处,恳请指正。
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长