提问人:Mohamad_T 提问时间:11/8/2023 最后编辑:πάντα ῥεῖMohamad_T 更新时间:11/8/2023 访问量:91
关系运算符精度
Relational operators precision
问:
我有一个关于关系运算符的问题 他们总是给出正确的结果吗? 因为如果我们运行这行代码,它将产生 1 而不是 0
cout<<(ULLONG_MAX==-1);
如果我们不断减去两边的 1,它将得到 1
因此,这可能会在我们的程序中产生错误的结果
解决方案是什么?
答:
5赞
Ted Lyngmo
11/8/2023
#1
在这种比较中
ULLONG_MAX == -1
你有一个和一个.在比较值之前,操作数会经历积分提升,其中 被提升到 ,这就像这样做使两个操作数具有共同的类型一样。unsigned long long
int
int
unsigned long long
static_cast<unsigned long long>(-1)
现在,一个不能持有这个值,然后它会“环绕”成为最大的可能——这正是价值所持有的。unsigned long long
-1
unsigned long long
ULLONG_MAX
因此,比较和打印将显示(除非有效)。true
true
1
std::boolalpha
评论
1赞
Mohamad_T
11/8/2023
好的,我现在明白了,我将制作一个函数来处理这种情况,非常感谢。
2赞
Artyer
11/8/2023
#2
由于您正在寻找解决方案:
如果您不小心这样做了,启用警告(或者更具体地说,在 clang 或 gcc 上)应该会发出警告:-Wall
-Wsign-compare
warning: comparison of integers of different signs: 'unsigned long long' and 'int' [-Wsign-compare]
解决方法是确保所有内容都具有相同的类型。
如果你真的想比较两个不同类型的对象,你可以使用 std::cmp_equal
(或者如果你不能使用 C++20,则可以使用示例实现):
std::cout << std::cmp_equal(ULLONG_MAX, -1); // Outputs 0
它直接比较整数的值,而不考虑类型。
评论
0赞
Ted Lyngmo
11/8/2023
凉。我错过了,朋友们出现在图书馆里!cmp_equal
评论
unsigned long long one = 1; if (one < -1) cout << "How can 1 be less than -1?\n";