天天看点

《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第1章,建议4-1,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

关于整数类型数据的转换原则,在c99的6.3.1.3节中做了非常重要的阐述,其表达的主要意思如下:

当我们将一个整数类型的数据转换成除_bool类型之外的另一个整数类型时,如果这个值可以被新的整数类型所表示,那么它就不会被修改,可以正确转换;如果所转换的新类型是无符号的,那么这个值就会反复加上或减去这个新类型可以表示的最大值加1,直到这个值位于这种新类型的范围之内;如果所转换的新类型是有符号的,并且这个值无法用新类型表示,那么它的结果是由编译器定义的。

因此,为了保证整型数据转换时不会发生丢失或错误解释数据的情况,我们必须做一定的范围检查,以保证要转换的数据的值在新类型的取值范围之内。而在头文件limits.h中就定义了相关整型数据的取值范围,例如,在vc++ 2010中定义的limits.h部分代码如下所示:

举个例子,从一种无符号类型转换为一种有符号类型时,就可能发生数据的高位被截断而导致数据丢失,或者符号位丢失,所以在转换之前要对取值范围进行验证。下面的示例代码演示了如何从unsigned int类型转换为signed char类型:

同样,如果将有符号类型转换为无符号类型,也必须进行取值范围的验证,示例代码如下所示:

在数据类型由“高级向低级”转换的时候,同样必须进行取值范围验证,示例代码如下所示:

继续阅读