首页 > 解决方案 > 这是正确的 uint64_t 比较吗?

问题描述

我正在尝试用 3 种方式比较 64 位数字,ed 结果必须类似于memcmpor strcmp

我想出了这个,但如果我输入一些非常大的数字,我不能确定它是否会正常运行。

汇编看起来很棒,但我担心它是否正确,因为如果我使用分支编译器不会生成相同的代码。

https://gcc.godbolt.org/z/UNtPGh

#include <cstdint>
#include <algorithm>

int f(uint64_t a, uint64_t b){
    auto x = std::max(a, b);

    int xa = (x - a) > 0;
    int xb = (x - b) > 0;

    return xb - xa;
}

inline int f1(uint64_t a, uint64_t b){
    return f(b, a);
}

int main(){
    return f(550u, 5555u);
}

标签: c++compare

解决方案


这似乎是著名的两个参数sgn模板代码的变体,但使用max

template<typename T>
constexpr int sgn(T a, T b){
    return (a > b) - (a < b);
}

是的,它适用于uint64_t并产生完全相同的汇编代码。


推荐阅读