我在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++相关问答推荐

丑陋的三重间接:可扩展的缓冲区管理 struct

我编译了一个新的c程序,并收到以下错误

堆栈帧和值指针

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

如何在C中通过套接字自定义数据类型读取原始变量?

在编译时参数化类型定义

为什么GCC C23中的关键字FALSE不是整数常量表达式?

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

CC2538裸机项目编译但不起作用

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

强制转换变量以在 struct 中蚕食

从不兼容的指针类型返回&&警告,但我看不出原因

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

赋值两侧的后置增量,字符指针

将复合文字数组用作临时字符串缓冲区是否合理?

共享内存未授予父进程权限

函数指针作为函数参数 - 应该使用 const 吗?

子进程不会修改父进程中的统计信息