我需要一个函数来计算 unsigned val
的总和和 signed dX
并将结果包装在 lower
范围内和 upper
例如:
值为 5
, 变化 -6
, 以及 0
的范围和 10
会返回 10
.
< 1 2 3 4 5 6 7 8 9 10 >
值为 2
, 变化 3
, 和 1
的范围和 3
会返回 2
/*
* Given a value and a change in that value (dX), find the sum and wrap it between lower and upper.
*/
unsigned int wrap(unsigned int val, const int dX, const unsigned int lower, unsigned int upper)
{
}
我真的不知道如何处理无符号和有符号的加法/减法以避免下溢。我也不确定如何包装下限。
最佳答案
如果您愿意将dx
从const int
更改为int
,您可以在循环中进行算术运算。这避免了 upper - lower
超过 INT_MAX
可能出现的问题。
#include <stdio.h>
unsigned int wrap_add(unsigned int val,
int dx,
const unsigned int lower,
const unsigned int upper);
int main(void)
{
printf("Range [0, 10]: 5 + (-6) = %u\n", wrap_add(5, -6, 0, 10));
printf("Range [1, 3]: 2 + 3 = %u\n", wrap_add(2, 3, 1, 3));
printf("Range [2, 5]: 2 + (-9) = %u\n", wrap_add(2, -9, 2, 5));
return 0;
}
unsigned int wrap_add(unsigned int val,
int dx,
const unsigned int lower,
const unsigned int upper)
{
while (dx < 0) {
if (val == lower) {
val = upper;
} else {
--val;
}
++dx;
}
while (dx > 0) {
if (val == upper) {
val = lower;
} else {
++val;
}
--dx;
}
return val;
}
程序输出:
Range [0, 10]: 5 + (-6) = 10
Range [1, 3]: 2 + 3 = 2
Range [2, 5]: 2 + (-9) = 5
关于c++ - 围绕一个范围包装无符号整数加法/减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941088/