int saturated_add(int a, int b)
{
int sum = a + (unsigned)b; // avoid signed-overflow UB
if (a >= 0 && b >= 0)
return sum > 0 ? sum : INT32_MAX; // catch positive wraparound
else if (a < 0 && b < 0)
return sum > 0 ? INT32_MIN : sum; // catch negative wraparound
else
return sum; // sum of pos + neg always fits
}
2条答案
按热度按时间dy2hfwbg1#
您可以执行下列步骤来仿真饱和的带负数号加:
无符号,更简单,请参阅this stackoverflow posting
在SSE 2中,上述操作Map为一系列并行比较和AND/ANDN操作。不幸的是,硬件中没有单一的操作可用。
oalqel3c2#
饱和无符号减法很容易,因为对于'a -= b',我们可以
使用SSE。
我在寻找无符号加法,但可能的话,唯一的方法是转换成饱和无符号减法,执行它,然后再转换回来。
编辑:对于无符号加法,你可以这样得到
min (a, ~b) + b
,这当然是有效的。对于有符号加法和减法,你有两个饱和边界,这使事情变得复杂。