本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第1章,建议4,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
建议4:数据类型转换必须做范围检查
在C语言中,数据类型转换一般可分为隐式转换和显式转换,也称为自动转换和强制转换。其中,常见的隐式转换有4种,如下所示。
1)一般算术转换:通过某些运算符将操作数的值从一种类型自动转换成另为一种类型,这一规则为“由低级向高级转换”,具体如图1-37所示。
根据图1-37所示的规则可知,若参与运算的变量类型不同,则先将变量的类型转换成同一类型,然后再进行运算。例如,int类型的变量和long类型的变量参与运算时,则会先把int类型的变量转成long类型,然后再进行运算。
这里需要特别注意的是,所有的浮点运算都是以双精度进行的,即使表达式中仅含float单精度变量,也要先将其转换成double类型后再进行运算。同时,如果char类型的变量和short类型的变量参与运算,则必须先转换成int类型。
2)输出转换:输出的操作数类型与输出的格式不一致时所进行的数据类型的转换。如下面的示例代码所示:
printf("%u",-1);
在VC++ 2010中,上面的代码将输出的值为4294967295。
3)赋值转换:在赋值运算过程中将赋值运算符右侧的操作数类型转换成左侧操作数据的类型。
4)函数调用转换:当实参类型和形参类型不一致时数据所进行的转换。
同样,显式转换也提供了两种转换方法,如下所示。
1)强制性数据类型转换:它是将一种类型的数据强制转换成为另一种数据类型。其格式为:
(数据类型标识符)表达式;
其作用是将表达式的数据类型强制转换成数据类型标识符所表示的类型。示例代码如下所示:
int i1=321;
float f4=(float)i1/9.0f;
2)利用C语言提供的标准函数转换,示例代码如下所示:
int i1;
char *c;
c="123";
i1=atoi(c);
printf("%d",i1);