我有一个问题,那就是,当我对数组的值求和(都是正数,我通过打印数组的值进行验证)时,我最终得到一个负值。我的总和代码是:
int summcp = 0;
for (k = 0; k < SIMUL; k++)
{
summcp += mcp[k];
}
printf("summcp: %d.\n", summcp);`
有关此问题的任何提示将不胜感激。
你正在调用未定义的行为.
由于整数变量只能保存有限范围的值,因此标准未定义超出此范围。基本上任何事情都可能发生。在您的(也是最常见的)情况下,它只是简单地包装其二进制表示形式。由于它用于负值,因此您将这样阅读。
为了避免这种情况,请使用类型summcp
可以容纳all可能的值。另一种方法是检查下一个添加是否会溢出:
if ( summcp >= INT_MAX - mcp[k] ) {
// handle positive overflow
}
请注意,以上仅适用于mcp[k] >= 0
和积极的溢出。其他 3 种情况需区别对待。一般来说,如果需要的话,使用足够大的类型进行求和并测试溢出是最好的、更快的、更容易的。
不要想添加并测试结果!。由于整数溢出是未定义的行为,这不适用于所有架构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)