按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 几天前,StackExchange成员Anto询问了按位运算符的有效用法。我说过,移位比将整数除以2的幂更快。StackExchange成员Daemin反驳说,右移带来了负数问题。 那时,我还没有真正考虑过将带符号整数用于移位运算符。我主要在底层软件开发中使用了该技术。因此,我总是使用无符号整数。C对无符号整数执行逻辑移位。执行逻辑右移时,无需注意符号位。空位用零填充。但是,当右移有符号整数时,C执行算术移位运算。空位用符号位填充。此差异导致负值四舍五入为无穷大而不是被舍弃为零,这与有符号整数除法不同。 经过几分钟的思考,得出了第一手的解决方案。该解决方案在移位之前有条件地将负值转换为正值。在执行移位操作后,值将有条件地转换回其负数形式。 int a = -5; int n = 1; int negative = q < 0; a = negative ? -a : a; a >>= n; a = negative ? -a : a; 该解决方案的问题在于,通常将条件赋值语句转换为至少一个跳转指令,并且在不对两个指令路径都进行解码的处理器上,跳转指令可能会非常昂贵。必须两次重新灌注指令流水线才能很好地降低通过分频获得的任何性能提升。 综上所述,我在周六醒来,回答了条件分配问题。我们在执行算术移位运算时遇到的舍入问题仅在使用二进制补码表示形式时发生。它不会以补码表示出现。该问题的解决方案包括在执行移位操作之前将二进制补码值转换为一个二进制补码值。然后,我们必须将一个人的补码值转换回一个两个人的补码值。令人惊讶的是,我们可以执行这组操作,而无需在执行移位操作之前有条件地转换负值。 int a = -5; int n = 1; register int sign …