重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站设计、环翠网络推广、微信小程序开发、环翠网络营销、环翠企业策划、环翠品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供环翠建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
int main()
{unsigned int a=0,c,n,c1,i;
scanf("%u",n);
c=1;
for(i=1;i=n;i++)
{c*=i;
if(cc1)
{printf("unsigned int最大可以计算%u以内的阶乘。\n%u!=%u\ns(%u)=%u",i-1,i-1,c1,i-1,a);
break;
}
a+=i;
c1=c;
}
return 0;
}
这个是用VC6写的控制台程序中从2147483644开始累加的数列,可以看出溢出的时候没有任何错误提示:
2147483644
2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646
-2147483645
-2147483644
-2147483643
-2147483642
这个是我写的可以判断溢出的加法函数:
#include stdio.h
int uoadd (int a,int b,int *overflow);
int overflow;
int main ()
{
int a=2147483647-9,b=10,c=0;
c=uoadd(a,b,overflow);
if (overflow == 1)
printf ("溢出!\n");
else
printf ("%d\n",c);
return (0);
}
int uoadd (int a,int b,int *overflow)
{
*overflow=0;
if (a0 b0 a+b0) *overflow=1;
if (a0 b0 a+b0) *overflow=1;
return (a+b);
}
VC6编译,新建工程的时候选控制台程序
其实其他的应用程序可能会内置判断溢出的东西,比如VB就会判断,如果数据溢出了就会弹出一个对话框,其他的就不知道了
其实这个东西用汇编解决相当容易了,但考虑到可读性还是用C比较好
判断边界:void outstr(int a[10])
{ for(i=0;a[i]!=0i10;i++) {
printf("%d\n",a[i]);
}}当i=10时,判断i10同时需要判断a[i]!=0,此时a[10]已经访问到非法区域,可能引起缓冲区溢出问题。防止方法:将判断条件分成几条语句例:if(i10){ if(a[i]!=0) {
... }}
/SPAN