Sum of positive values in an array gives negative result in a c program

后端 未结 4 1591
渐次进展
渐次进展 2021-01-26 10:16

I have a problem that is, when I sum the values of an array (that are all positive, I verified by printing the values of the array), I end up with a negative value. My code for

4条回答
  •  春和景丽
    2021-01-26 10:21

    This smells like an overflow issue; you might want to add a check against that like

    for (k = 0; k < SIMUL && (INT_MAX - summcp > mcp[k]); k++ )
    {
      sumcp += mcp[k];
    }
    
    if (k < SIMUL)
    {
      // sum of all mcp values is larger than what an int can represent
    }
    else
    {
      // use summcp
    }
    

    If you are running into overflow issues, you might want to use a wider type for summcp like long or long long.

    EDIT

    The problem is that the behavior of signed integer overflow is not well-defined; you'll get a different result for INT_MAX + 1 based on whether your platform uses one's complement, two's complement, sign magnitude, or some other representation for signed integers.

    Like I said in my comment below, if mcp can contain negative values, you should add a check for underflow as well.

    Regardless of the type you use (int, long, long long), you should keep the over- and underflow checks.

    If mcp only ever contains non-negative values, then consider using an unsigned type for your sum. The advantage of this is that the behavior of unsigned integer overflow is well-defined, and the result will be the sum of all elements of mcp modulo UINT_MAX (or ULONG_MAX, or ULLONG_MAX, etc.).

提交回复
热议问题