c++ - 这是正确的 uint64_t 比较吗?
问题描述
我正在尝试用 3 种方式比较 64 位数字,ed 结果必须类似于memcmp
or 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);
}
解决方案
这似乎是著名的两个参数sgn
模板代码的变体,但使用max
:
template<typename T>
constexpr int sgn(T a, T b){
return (a > b) - (a < b);
}
是的,它适用于uint64_t
并产生完全相同的汇编代码。