gpt4 book ai didi

c++ - 使用 -1 将所有位设置为真是否安全?

转载 作者:IT老高 更新时间:2023-10-28 11:33:06 25 4
gpt4 key购买 nike

我已经看到这种模式在 C 和 C++ 中被大量使用。

unsigned int flags = -1;  // all bits are true

这是实现此目的的一种很好的便携方式吗?还是使用 0xffffffff~0 更好?

最佳答案

我建议您完全按照您的说明进行操作,因为它是最直接的方法。初始化为 -1 它将工作总是,独立于实际的符号表示,而 ~ 有时会出现令人惊讶的行为,因为你必须有正确的操作数类型。只有这样,您才能获得 unsigned 类型的最高值。

关于可能的惊喜的示例,请考虑以下示例:

unsigned long a = ~0u;

它不一定会将所有位为 1 的模式存储到 a 中。但它会首先在 unsigned int 中创建一个所有位为 1 的模式,然后将其分配给 a。当 unsigned long 有更多位时会发生什么,并不是所有位都是 1。

考虑一下这个,它在非二进制补码表示上会失败:

unsigned int a = ~0; // Should have done ~0u !

原因是 ~0 必须反转所有位。反转将在二进制补码机器上产生 -1(这是我们需要的值!),但在另一个机器上 不会产生 -1表示。在一个补码机器上,它产生零。因此,在一个补码机器上,上面的代码会将 a 初始化为零。

您应该理解的是,这一切都与值(value)有关,而不是位。该变量使用 value 进行初始化。如果在初始化程序中修改了用于初始化的变量的位,则将根据这些位生成值。将 a 初始化为可能的最高值所需的值是 -1UINT_MAX。第二个将取决于 a 的类型 - 您需要将 ULONG_MAX 用于 unsigned long。但是,第一个不依赖于它的类型,这是获得最高值的好方法。

我们不是在讨论 -1 是否所有位都为一(并非总是如此)。我们不是在讨论 ~0 是否所有位都为一(当然是)。

但是我们说的是初始化flags变量的结果是什么。而对于它,只有 -1 可以适用于所有类型和机器。

关于c++ - 使用 -1 将所有位设置为真是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809227/

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