在累积变量时检测无符号溢出

时间:2015-03-11 17:02:49

标签: c

我有两个无符号的32位整数,称它们为x和y。我想通过看似随机的uint32值定期增加两个uint32。 x和y会累积,我希望它们继续累积,直到它们达到极限,此时我希望它们以0 +开始,如果它们没有溢出,它们本来应该添加的值。

假设代码如下:

//This would be called, say every 5 seconds
void increment_vals(uint32_t *x, uint32_t *y, uint32_t x_inc, uint32_t y_inc)
{
    *x += x_inc;
    *y += y_inc;

    if (x overflowed || y overflowed)
    {
        *x = x_inc;
        *y = y_inc;
    }
}

基本上我的问题是:我怎么知道x或y何时溢出并需要重置?我应该在递增前存储x和y,如果结果小于原始值,那么它必须溢出吗?这有保证吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您可以在递增之前检查溢出:

if(x_inc > (MAXINT - *x)) {
    //about to overflow
}

答案 1 :(得分:1)

我建议

uint32_t xx = *x + x_inc;
if (xx < *x)
     *x = 0;
else *x = xx;

答案 2 :(得分:0)

我发现this document在回答我的问题时非常有帮助和描述性,特别是第172页:

“对于无符号整数,如果总和小于任一操作数, 发生了溢出。“