我在C&;C++中看到过很多次使用这种模式.
unsigned int flags = -1; // all bits are true
这是一个很好的便携方式来实现这一点吗?还是使用0xffffffff
或~0
更好?
我在C&;C++中看到过很多次使用这种模式.
unsigned int flags = -1; // all bits are true
这是一个很好的便携方式来实现这一点吗?还是使用0xffffffff
或~0
更好?
我建议你完全按照你展示的那样做,因为这是最直接的一个.初始化为-1
将工作always,与实际的符号表示无关,而~
有时会有令人惊讶的行为,因为必须使用正确的操作数类型.只有这样,您才能获得unsigned
类型中的最高值.
作为一个可能的惊喜的例子,考虑一下这一点:
unsigned long a = ~0u;
它不一定会存储所有位为1到a
的模式.但它将首先创建一个模式,将unsigned int
中的所有位1分配给a
.当unsigned long
有更多比特时,并不是所有的比特都是1.
并且考虑这一个,它将在非二元互补表示中失败:
unsigned int a = ~0; // Should have done ~0u !
原因是~0
必须反转所有位.在2的补码机上,将其反转将产生-1
(这是我们需要的值!),但not将在另一次代表中产生-1
.在一的补码机上,它的结果是零.因此,在1的补码机上,上述值将初始化a
为零.
你应该明白的是,这一切都是关于价值的,而不是比特.该变量被初始化为value.如果在初始化器中修改用于初始化的变量的位,则将根据这些位生成值.将a
初始化为可能的最高值所需的值是-1
或UINT_MAX
.第二个取决于a
的类型-unsigned long
需要使用ULONG_MAX
.但是,第一个不依赖于它的类型,这是获得最高值的好方法.
We are not talking about whether 100 has all bits one (it doesn't always have). And we're not talking about whether 101 has all bits one (it has, of course).
但是我们现在讨论的是初始化flags
变量的结果.对于它,only 101将适用于每种类型和机器.