测试技术从一个程序的Bug解析C语言的类型转换
白羽 2019-03-07 来源 :网络 阅读 952 评论 0

摘要:本文将带你了解测试技术从一个程序的Bug解析C语言的类型转换,希望对大家学测试技术有所帮助。

    本文将带你了解测试技术从一个程序的Bug解析C语言的类型转换,希望对大家学测试技术有所帮助。


测试技术从一个程序的Bug解析C语言的类型转换y

先看下面一段程序,这段程序摘自《C 专家编程》:
     #include<stdio.h>
     int  array[]={23,34,12,17,204,99,16};
     #define  TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
     int  main(void)
     {
     int d=-1,x;
     /*........*/
     if(d<=TOTALTOTAL_ELEMENTS-2)
     x=array[d+1];
     /*........*/
     return 0;
     }
     如果是有这样一段程序的话,你永远无法知道x的值到底是多少,因为这句赋值语句x=array[d+1];根本不会执行。原因在哪?经过调试发现程序执行到if语句进行判断完之后,直接跳过下面一条语句的执行。下面来分析一下原因,因为sizeof求算类型大小时的返回值是unsigned int类型,而d是signed int,if语句测试两者大小,d会自动升级为unsigned int,-1转换为unsigned  int是一个很大的正整数,所以表达式的值永远为假,因此后面的赋值语句永远不会执行。这里面就是类型转换带来的bug,如果稍不注意,则可能对整个工程或者项目造成无法预测的后果,而这个bug是很难直接调试能够调试得出来的。
     一.表达式中的类型转换
     类型转化包括强制类型转化和隐式转换,这里所谈的都是隐式转换。
     先来了解一下传统C(K&R C)中隐式类型转换的规则:
     1)首先任何char、short int类型的操作数都会被转换成int类型,任何float类型都会被转换为double型。
     2)如果一个操作数是double型,那么另外一个操作数也被转换为double,计算结果也是double;
     如果一个操作数是long型,那么另外一个操作数也被转换为long型,计算结果也是long;
     如果一个操作数是unsigned,那么另外一个操作数也被转换为unsigned,计算结果为unsigned。
     而在新的标准中却作了一些修改:
     1)整型升级:所有的char,short  int和位段都会首先自动转换成int或者unsigned int。如果int能够表示源类型的所有值,那么就转换为int,否则转换为unsigned  int。
     2)在计算表达式的值时,通常首先会将低类型(能够表示的数据范围小的数据类型)转换为高类型,再参与计算。但是这里要注意的一点是,如果表达式中存在float型,则不一定会被转换为double型,然后再进行计算。如有下面这段代码;
     float f1,f2;
     double d;
     f1=d*f2;
     如果采用单精度进行计算的话,最后结果同双精度计算结果相同,那么对f2可能不进行转换。这一点和传统C是不同的,但是目前很少有编译器(VC就不支持)支持这点。
     3)当表达式中存在无符号和有符号类型的操作数时,
     如果一个操作数是unsigned long int,那么另一个操作数也被转换为 unsigned long int;
     如果一个操作数是long int,另一个操作数是unsigned int。如果long int能够表达unsigned int的表示范围,则另一个操作数被转换为long int;否则两个操作数都被转换为unsigned long int;
     如果一个操作数是unsigned int,另一个操作数是int,那么另一个操作数被转换为unsigned int。
     下面看一个例子:
     假设int是16位,long int是32位。
     那么对于-1L<1U,因为-1L是signed  long int型的,而1U是unsigned int型,由于signe long int能够完全表示unsigned int的范围,所以1U被转换为signed long int;
     对于-1L>1UL,因为-1L是signed  long int型的,而1UL是unsigned long int型,则-1L被转换为unsigned long int    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标软件测试之测试技术频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程