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

C++ 为什么使用(t1-t2)>;(1U<;<;31)而不是纯粹的比较?,c++,C++,我从旧项目中获得代码: inline bool timer_timestamp_less(uint32_t t1,uint32_t t2){ return (t1-t2)>(1U<<31); } 头痛过后,我明白代码是等价的 if(t1>t2)... 我的前任在缺少cafe的时候有代码。还是我觉得太简单了?不,重构并不能在所有情况下恢复相同的结果:如果(!timer\u timestamp\u less(t1,t2))与如果(t1>t2)几乎相同 原始

我从旧项目中获得代码:

inline bool timer_timestamp_less(uint32_t t1,uint32_t t2){
        return (t1-t2)>(1U<<31);
}
头痛过后,我明白代码是等价的

if(t1>t2)...

我的前任在缺少cafe的时候有代码。还是我觉得太简单了?

不,重构并不能在所有情况下恢复相同的结果:
如果(!timer\u timestamp\u less(t1,t2))
如果(t1>t2)
几乎相同

原始实现似乎依赖于表达式
t1-t2
的定义良好的环绕行为,在
t2
大于
t1
的情况下,表达式将向最高有效位注入1,并且
t1
t2
都没有将原始位设置为1。(在后一种情况下,行为要复杂得多。)

对于[0231-1]范围内的
t1
t2
的值,等效表达式实际上是
!(t1
。目前,在
t1
t2
相等的情况下,表达式有所不同:

#include <iostream>
using namespace std;

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

inline bool timer_timestamp_less_2(uint32_t t1,uint32_t t2){
    return (t1 < t2);
}

int main(){
    // Equivalent
    cout << !timer_timestamp_less_1(1, 2) << endl; // 0
    cout << !timer_timestamp_less_2(1, 2) << endl; // 0
    // Not Equivalent
    cout << !timer_timestamp_less_1(-1, 2) << endl; // 0
    cout << !timer_timestamp_less_2(-1, 2) << endl; // 1
}
#包括
使用名称空间std;
内联布尔计时器\u时间戳\u小于\u 1(uint32\u t t1,uint32\u t t2){

返回(t1-t2)>(1这可能是一种思维过程,他们意识到自己得到了错误的结果,并为错误的结果编写了一个测试,而不是你的前任在编写这篇文章时所设想的原因。我想说,希望我更改了代码,希望解决方案不会有任何错误。没有对这行代码进行注释是,嗯O、 不可原谅。玩时间戳算法?要非常小心,尤其是在调用timer\u timestamp\u less()时。但是我可以问一个问题吗。
timer\u timestamp\u less\u 1
为什么会给出
0
的结果?这段代码是使用
unsigned int
对有符号数字进行比较的吗?我使用负数强制无符号类型的最高有效位中插入1位。这是标准定义良好的行为。如果您更容易理解的话胃,用UINT_MAX代替my-1。
#include <iostream>
using namespace std;

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

inline bool timer_timestamp_less_2(uint32_t t1,uint32_t t2){
    return (t1 < t2);
}

int main(){
    // Equivalent
    cout << !timer_timestamp_less_1(1, 2) << endl; // 0
    cout << !timer_timestamp_less_2(1, 2) << endl; // 0
    // Not Equivalent
    cout << !timer_timestamp_less_1(-1, 2) << endl; // 0
    cout << !timer_timestamp_less_2(-1, 2) << endl; // 1
}