gpt4 book ai didi

c++ - 使用 ~0 或 -1 来表示所有位都翻转为 1 的类型是否更便携?

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:31 25 4
gpt4 key购买 nike

我今天看到一个代码示例,它使用以下形式检查 -1 是否为无符号 64 位整数:

if (a == (uint64_t)~0)

是否有任何您想要与 ~0 进行比较的用例?而不是像 std::numeric_limits<uint64_t>::max() 这样的东西或直接向上 -1 ?我不清楚最初的意图,因为我以前从未见过这样的比较。

为了澄清,比较正在检查错误条件,其中无符号整数类型将其所有位设置为 1 .

更新

根据 https://stackoverflow.com/a/809341/1762276 , -1并不总是表示翻转为 1 的所有位但是~0做。这是正确的吗?

I recommend you to do it exactly as you have shown, since it is the most straight forward one. Initialize to -1 which will work always, independent of the actual sign representation, while ~ will sometimes have surprising behavior because you will have to have the right operand type. Only then you will get the most high value of an unsigned type.

我相信只要 ~0 就会处理这个错误案例始终是正确类型的大小写(如所示)。所以这表明 (uint64_t)~0确实是所有位翻转的无符号类型的更准确和门户表示?

以下所有内容似乎都是正确的 (GCC x86_x64):

#include <iostream>
#include <limits>
using namespace std;

int main() {
uint64_t a = 0xFFFFFFFFFFFFFFFF;

cout << (int)(a == -1) << endl;
cout << (int)(a == ~0) << endl;
cout << (int)(a == (uint64_t)-1) << endl;
cout << (int)(a == (uint64_t)~0) << endl;
cout << (int)(a == static_cast<uint64_t>(-1)) << endl;
cout << (int)(a == static_cast<uint64_t>(~0)) << endl;
cout << (int)(a == std::numeric_limits<uint64_t>::max()) << endl;

return 0;
}

结果:

1
1
1
1
1
1
1

最佳答案

通常,您应该在应用运算符之前进行转换,因为转换为更宽的无符号类型可能会或可能不会导致符号扩展,具体取决于源类型是否已签名。

如果您想要一个原始类型 T 的所有位都已设置的值,最可移植的方法是 ~T(0)。它也应该适用于任何类似数字的类。

正如 Bingley 先生所说,stdint.h 中的类型保证是补码,因此 -T(1) 也会给出一个值所有位设置。

您引用的来源有正确的想法但遗漏了一些细节,例如 (T)~0u(T)-1u 都不是与 ~T(0u)-T(1u) 相同。 (公平地说,litb 并没有在您链接的那个答案中谈论扩大)

请注意,如果没有变量,只有一个无后缀的文字 0-1,那么源类型保证是有符号的,并且上述问题都不适用.但是,当普遍正确的代码不再复杂时,为什么要在处理文字时编写不同的代码呢?

关于c++ - 使用 ~0 或 -1 来表示所有位都翻转为 1 的类型是否更便携?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42869552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com