我在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初始化为可能的最高值所需的值是-1UINT_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将适用于每种类型和机器.

C++相关问答推荐

非 ASCII 字符集作为 C 字符串

`__attribute__((destructor))` 在某些情况下没有运行?

删除逗号之间的白色字符,但不删除逗号内的内容

为什么将输出写入正在缓冲的管道

为什么 memchr() 将 void 指针作为输入?

如何在c中的图中标记已访问过的顶点

新手:定义的字符串是否设置为所有 NULL?

指针似乎与 printf 的输出不同步

套接字编程中shutdown()函数中SHUT_RDWR的用途

OpenMP 线程 ID 如何与递归一起工作?

为什么这个 .c 文件 #include 本身?

复制具有“memcpy”技术上未定义行为的二维数组?

绝对值 abs(x) 使用按位运算符和布尔逻辑

(x | y) - y 为什么不能简单地是 x 甚至 `x | 0`

我可以用 NULL 代替 0 的值吗?

升级到 Catalina 10.15 后无法在 Mac 上编译 C 程序

为什么不鼓励静态链接 glibc?

如何检测 C 代码(需要'extern C')是否在 C++ 中编译

gcc中有128位整数吗?

if-else 块中的“if (0)”块的目的是什么?