无符号unsigned带来的问题探讨

C语言有符号无符号数问题

题目:用下图代码计算数组array中所有元素的和,其中元素的数量由参数length给出.

问题:

  1. 试分析这段程序,当参数length=0,运行结果/返回值为多少?
  2. 运行这段代码, 当参数length=0,实际会产生什么结果?
  3. 请解释实际运行结果产生的原因.
  4. 修改代码以得出正确结果.

:先讨论参数为有符号类型.

  1. 此函数显然为叠加求数组元素的和,在不发生越界的情况下就不会有异常出现.(越界情况暂不讨论,可由注释掉的内容研究).那么当参数为0时,显然不会执行for循环,所以返回结果必然为方法中定义的result初始值0;
  2. 原因见1.

:再讨论参数为无符号类型.

  1. 按照常理(有符号),结果想必为0.但在编译的时候有warning:

D:\vc++6.0\MyProjects\www\sss.cpp(7) : warning C4018: '<=' : signed/unsigned mismatch

显然,程序异常退出,操作系统直接结束了它.以至于什么也没有返回.

3     变量值在存储单元中都是以补码的形式存储的,存储单元的第一个二进位制代表符号.整型变量(有符号)以int且字节数为4的那个为例,那么它的取值范围就在231231-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<=?),让程序彻底崩溃.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值