-1

我看到一些看起来像这样的代码:

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?我看到另一篇关于0xff 在 2 的补码系统上等于 -1 的帖子,并发现另一篇认为这意味着 C++ 程序是否将 0xff 解释为 -1 或 ~0 取决于系统?

当填充 0xff 时,C++ 中检查整数的可移植方式到底是什么?是否应该根据 unsigned int 或 signed int 检查?我很混乱...

4

1 回答 1

3
~0

只需将所有位设置为 1。例如,如果您有 32 位 int 并且您使用

int all_the_ones = ~0;

然后你会进入11111111111111111111111111111111包含值的内存部分all_the_ones

0xff将 8 位设置为 1,因此对于 32 位 int 它将是00000000000000000000000011111111

无论如何,对于 int 上的 0xff 等于 ~0,所讨论的 int 需要是 8bit/1byte,也就是char

unsigned char a = ~0;
signed char b = ~0;

将给出 a 等于 255 和 b 等于 -1

在记忆中他们都是11111111

我不明白您为什么想知道 0xff 是否存储在 int 中,但与ab以上的比较应该有效。

于 2017-01-21T02:17:33.183 回答