首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教一个关于C语言数据溢出的检验程序有关问题和setjmp函数,有代码

2014-01-05 
求教一个关于C语言数据溢出的检验程序问题和setjmp函数,有代码最近在做毕设,课题是解决编译器对于数据溢出

求教一个关于C语言数据溢出的检验程序问题和setjmp函数,有代码
最近在做毕设,课题是解决编译器对于数据溢出不报错的问题的解决办法,也就是说要设计一个算法或者流程,当在运算中(打比方,两个向量的相加相减和内积的运算)出现数据溢出的时候,程序能检测出来,然后提示并报错。

我根据课内的目标写了一小段代码,用到了C语言的跳转,setjmp()和longjmp(),可是遇到了一些小小的问题,特来请教有经验的前辈。



当两个向量相加时,32767+1结果时-32767,得到的P3点的响应值跟真正的32768不对应,会进入longjmp的跳转部分,但是跳转完之后我那个the result is overflow那个输出就进入无限循环了,也就是不停的输出,想请教是什么原因。 还有就是关于数据溢出的检测,我这么做有没有问题?涉及到向量的内积,也就是两点相乘的时候出现溢出,要如何检测?十分感谢。
[解决办法]
太谢谢你了,例子十分清楚,容我追加一个问题,就是乘法的溢出,代码中我没有处理乘法部分是因为我还没弄明白如何处理他们?你有好的建议吗?尤其是对于带符号的向量,内积中可能会有一部分的乘法结果溢出,但是有负值的话,最后求得的内积的和还是有可能在范围内,导致加减法溢出的检验方法不适用。

===============
一样啊。用一个更大的类型,比如int, 如果计算的结果超出了short的范围,则溢出。代码几乎一模一样,两overflow函数都是重用的。
void Multiply(Point p1, Point p2, Point* rslt)
{
   int x=(int)p1.x*p2.x;
   int y=(int)p1.y*p2.y;
   int z=(int)p1.z*p2.z;

   if(overflow(x) 
[解决办法]
 overflow(y) 
[解决办法]
 overflow(z))
       longjmp(jump_buffer, 3); // suppose we decide to differentiate MULTIPLY overflow


   rslt->x=(short)x;
   rslt->y=(short)y;
   rslt->z=(short)z;
}



随手敲的,不保证能够运行。意思在那里了。

热点排行