C语言溢出判断

Python06

C语言溢出判断,第1张

这个是用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 (a>0 &&b>0 &&a+b<0) *overflow=1

if (a<0 &&b<0 &&a+b>0) *overflow=1

return (a+b)

}

VC6编译,新建工程的时候选控制台程序

其实其他的应用程序可能会内置判断溢出的东西,比如VB就会判断,如果数据溢出了就会弹出一个对话框,其他的就不知道了

其实这个东西用汇编解决相当容易了,但考虑到可读性还是用C比较好

一般在工作中会根据实际情况考虑使用合适的数据类型。比如你要存储一个省的人数,你就不能去选择char型,而应该选择int或者能存储更大数据的类型。

所以通常是通过选择合适数据类型来避免溢出。

如果非得判断数据是否溢出,我给你一个方法。通过将其扩大到一个大的数据类型然后进行数据溢出判断。

eg:

char a = X //X是随机数据

int b = a * Y//Y是随机数据

if( b <-128 || b >127) 对于a这种char类型来说则溢出。

#include <stdio.h>

int main()

{unsigned int a=0,c,n,c1,i

scanf("%u",&n)

c=1

for(i=1i<=ni++)

{c*=i

 if(c<c1)

 {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

}