我有两个无符号的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,如果结果小于原始值,那么它必须溢出吗?这有保证吗?
感谢。
答案 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页:
“对于无符号整数,如果总和小于任一操作数, 发生了溢出。“