使用-1将所有位设置为true安全吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我看到这种模式在C&C++中使用了很多。

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

这是一个很好的便携方式来完成这一点吗?或正在使用0xffffffff~0好多了?

提问于
用户回答回答于

我建议你按照你所展示的那样去做,因为它是最直接的。初始化为-1它会起作用的,独立于实际的符号表示,而~有时会有令人惊讶的行为,因为您必须有正确的操作数类型。只有这样,才能获得unsigned打字。

要想得到一个可能的惊喜,请考虑下面这个:

unsigned long a = ~0u;

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

考虑一下这一个,它将失败在一个非二的补码表示:

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

原因是~0必须将所有的比特倒置。倒转-1在两个补码机上,但是会产量-1在另一种表象上。在一个人的补给机上,它产生零。因此,在一个人的补码机上,上面的内容将初始化a降到零。

你应该明白的是,这一切都是关于价值观的,而不是零碎的。变量初始化为价值,如果在初始化器中修改用于初始化的变量的位,则将根据这些比特生成值。初始化所需的值。a以尽可能高的价值,是-1UINT_MAX,第二个将取决于a-你需要使用ULONG_MAX为了unsigned long,但是,第一种类型并不取决于它的类型,它是获取最高价值的好方法。

我们是谈论是否-1有所有的第一位(它并不总是有)。我们是谈论是否~0有所有的第一位(当然有)。

但是我们要说的是初始化的结果flags变量是。为此,-1将适用于每一种类型和每台机器。

用户回答回答于
  • unsigned int flags = -1;是便携式的。
  • unsigned int flags = ~0;不是可移植的,因为它依赖于两个补码表示形式。
  • unsigned int flags = 0xffffffff;不是可移植的,因为它假设32位的INT。

如果想以C标准保证的方式设置所有位,请使用第一个。

扫码关注云+社区