关系运算符精度

Relational operators precision

提问人:Mohamad_T 提问时间:11/8/2023 最后编辑:πάντα ῥεῖMohamad_T 更新时间:11/8/2023 访问量:91

问:

我有一个关于关系运算符的问题 他们总是给出正确的结果吗? 因为如果我们运行这行代码,它将产生 1 而不是 0

cout<<(ULLONG_MAX==-1);

如果我们不断减去两边的 1,它将得到 1

因此,这可能会在我们的程序中产生错误的结果

解决方案是什么?

C++ 整数 二进制补码 关系运算符

评论

3赞 500 - Internal Server Error 11/8/2023
既然一个是明确的未签名,另一个是签名的,你的期望到底是什么,为什么?
0赞 Mohamad_T 11/8/2023
我希望它给出 0,因为它应该用语言处理,如果这只是问题,没关系,但其他数字也是如此
0赞 πάντα ῥεῖ 11/8/2023
@Mohamad_T ???????
0赞 Eljay 11/8/2023
为了好玩,请这样做:unsigned long long one = 1; if (one < -1) cout << "How can 1 be less than -1?\n";

答:

5赞 Ted Lyngmo 11/8/2023 #1

在这种比较中

ULLONG_MAX == -1

你有一个和一个.在比较值之前,操作数会经历积分提升,其中 被提升到 ,这就像这样做使两个操作数具有共同的类型一样。unsigned long longintintunsigned long longstatic_cast<unsigned long long>(-1)

现在,一个不能持有这个值,然后它会“环绕”成为最大的可能——这正是价值所持有的。unsigned long long-1unsigned long longULLONG_MAX

因此,比较和打印将显示(除非有效)。truetrue1std::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