为什么使用(t1-t2)&gt;(1U <&lt; 31)而不是纯粹的比较?

时间:2017-11-16 08:14:07

标签: c++

我从旧项目中获取代码:

inline bool timer_timestamp_less(uint32_t t1,uint32_t t2){
        return (t1-t2)>(1U<<31);
}

某处:

 if(!timer_timestamp_less(t1,t2)) ..

头疼之后,我明白代码是等价的

if(t1>t2)...

我的前任有缺乏咖啡馆的代码。或者我认为太简单了?

1 个答案:

答案 0 :(得分:3)

在所有情况下,您的重构都无法恢复相同的结果:if(!timer_timestamp_less(t1, t2)) 几乎if(t1 > t2)相同。

原始实现似乎依赖于表达式t1 - t2的明确定义的环绕行为,对于t2大于{{1}的情况,它将在最重要的位中注入1并且t1t1都没有将原始位设置为1.(在后一种情况下,行为要复杂得多。)

对于[0,2 31 - 1]范围内t2t1的值,等效表达式实际上是t2。目前,您的方式与!(t1 < t2)t1相等的情况有所不同:

t2

代码:https://ideone.com/yocmS2