概述
C语言有符号无符号数问题
题目:用下图代码计算数组array中所有元素的和,其中元素的数量由参数length给出.
问题:
- 试分析这段程序,当参数length=0时,运行结果/返回值为多少?
- 运行这段代码, 当参数length=0时,实际会产生什么结果?
- 请解释实际运行结果产生的原因.
- 修改代码以得出正确结果.
一:先讨论参数为有符号类型.
- 此函数显然为叠加求数组元素的和,在不发生越界的情况下就不会有异常出现.(越界情况暂不讨论,可由注释掉的内容研究).那么当参数为0时,显然不会执行for循环,所以返回结果必然为方法中定义的result初始值0;
- 原因见1.
二:再讨论参数为无符号类型.
- 按照常理(有符号),结果想必为0.但在编译的时候有warning:
D:vc++6.0MyProjectswwwsss.cpp(7) : warning C4018: '<=' : signed/unsigned mismatch
显然,程序异常退出,操作系统直接结束了它.以至于什么也没有返回.
3 变量值在存储单元中都是以补码的形式存储的,存储单元的第一个二进位制代表符号.整型变量(有符号)以int且字节数为4的那个为例,那么它的取值范围就在231到231-1.
而无符号基本整型变量的取值范围在0到232-1.这也就说明了它不能取负数.显然上述程序中当length为0时,length-1为负.也就相当于你给了它一个i<=?的条件,他不知道什么时候停止.直至内存耗尽,当然操作系统会终止它.
为了进一步说明问题,让我们把问题简化(如下图所示):显然陷入了死循环
或者我们可以加上被注释掉的内容,也就是显示出每一次数组元素的地址,值,以及返回值result的值.
结果如下三个图:
运行终止图1:
前期未越界运行正常,越界之后将result赋值为len的值0图2:
中期图开始给数组元素随便赋值如图3所示的a[24]:
4解决办法那当然是将无符号变为有符号,这样参数length就可以取一个确定的负数,也就不会执行for循环直接输出result的初值0.
归根结底:由无符号整型不能取负值而引发的for无法结束循环异常(i<=?),让程序彻底崩溃.
最后
以上就是忧伤小土豆为你收集整理的无符号unsigned带来的问题探讨的全部内容,希望文章能够帮你解决无符号unsigned带来的问题探讨所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复