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