如何用单次加法实现四组8位整数向量的C/C++加法(修复溢出问题)
8位整数向量的位运算加法实现问题
参考Stack Overflow的思路,将“一次加法+位运算实现8位整数中两对4位整数相加”的方法,推广到32位整数存储四个8位整数的向量相加场景,实现的C代码如下:
uint32_t a, b; uint32_t c = a + b; uint32_t r = a ^ b ^ c; // 计算所有进位 uint32_t s = r & (0x01010100); // 仅保留目标数位的进位 uint32_t sum = c - s; // 抵消这些数位上的进位影响
该代码在多数输入下正常工作,但在相加补码形式的接近0的负数时出现异常。例如:
测试输入:
a = 0xfffeff00 // 对应8位整数:(-1,-2,-1, 0) b = 0x01010100 // 对应8位整数:( 1, 1, 1, 0)
预期结果为 0x00ff0000,但实际运行结果为:
c = 0x01000000 // 对应8位整数:( 1, 0, 0, 0) r = 0xfffffe00 // 对应8位整数:(-1,-1,-2, 0) s = 0x01010000 // 对应8位整数:( 1, 1, 0, 0) sum=0xffff0000 // 对应8位整数:(-1,-1, 0, 0)
sum 的前两位变为 ff(代表-1),但正确结果应为0。问题根源在于计算 c - s 时,第二组的减法溢出影响了第一组的结果,导致跨组错误。目前尚未找到合适的改进方案。
内容的提问来源于stack exchange,提问作者fantasie
相关产品推荐
相关产品推荐

