我是靠谱客的博主 忧伤小土豆,最近开发中收集的这篇文章主要介绍无符号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.0MyProjectswwwsss.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<=?),让程序彻底崩溃.

 

最后

以上就是忧伤小土豆为你收集整理的无符号unsigned带来的问题探讨的全部内容,希望文章能够帮你解决无符号unsigned带来的问题探讨所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部