【发布时间】:2017-06-06 02:34:09
【问题描述】:
我看到一些代码是这样的:
Object *area = new Object[n];
memset(area, 0xff, sizeof(Object) * count);
所以这会用位 1 填充对象数组的每个字段。然后有多个地方通过检查 ~0(负零)来检查对象的字段是否尚未填充:
const unsigned int NULL_INDEX = ~0;
...
if(object.field == NULL_INDEX) {...}
该 Object 类的字段是 unsigned int 类型。我很困惑为什么 0xff 在无符号整数上可以被评估为等于〜0?我看到另一个 post 在 2 的补码系统上谈论 0xff 等于 -1,并发现另一个 post 我认为这意味着 C++ 程序将 0xff 解释为 -1 还是 ~0 取决于系统?
C++ 中填充 0xff 时检查整数的可移植方式到底是什么?是否应该根据 unsigned int 或 signed int 检查?我很困惑...
【问题讨论】:
-
~0不是负 0。 -
~ 反转每一位。
-
在最常见的表示形式(2 的补码)中,整数没有负 0。
-
你应该避免在 C++ 中使用
memset。例如,如果Object持有指针,则使用 0xFF 可能会出现问题。Object构造函数应该负责自己的初始化。对象应始终在创建时进行初始化,因此检查它们是否已初始化毫无意义。如果无法完成初始化,则应抛出异常。我建议您阅读 Sutter 的Exceptional C++等书籍。 -
@Phil1970 我知道,但我只是想了解现有代码的作用。
标签: c++ bit twos-complement ones-complement