我有一个问题,就是,当我对数组的值求和时(都是正值,我通过打印数组的值来验证),最后得到的是负值。我的密码是:

int summcp = 0;
for (k = 0; k < SIMUL; k++)
{
    summcp += mcp[k];
}
printf("summcp: %d.\n", summcp);`

关于这个问题的任何暗示都将不胜感激。

最佳答案

您正在调用未定义的行为。
由于整数变量只能包含有限的值范围,因此超出此范围的值是标准未定义的。基本上什么都有可能发生。在您(也是最常见的)的情况下,它只是围绕其二进制表示进行包装。因为它用于负值,所以您将按原样阅读。
要解决此问题,请使用可以保存所有可能值的类型forsummcp。另一种方法是检查下一个加法是否会溢出:

if ( summcp >= INT_MAX - mcp[k] ) {
    // handle positive overflow
}

请注意,以上仅适用于mcp[k] >= 0和正溢出。其他3起案件必须以不同的方式处理。一般来说,如果需要的话,使用一个足够大的sum类型和test lateron进行溢出测试是最好、更快和更容易的。
不要想添加和测试结果!。由于整数溢出是未定义的行为,因此这对所有体系结构都不适用。

07-26 03:32