为什么0xff在C++中等于负0

Why does 0xff equal to negative 0 in C++

我看到一些代码是这样的:

Object *area = new Object[n];
memset(area, 0xff, sizeof(Object) * count);

所以这会用位 1 填充对象数组的每个字段。然后有多个地方通过检查 ~0(负零)来检查对象的字段是否尚未填充:

const unsigned int NULL_INDEX = ~0;
...
if(object.field == NULL_INDEX) {...}

对象 class 上的字段是无符号整型。我很困惑为什么 0xff 在 unsigned int 上可以被评估为等于 ~0?我看到另一个 post talking about 0xff equals -1 on 2's complement system, and found another post,我认为这意味着 C++ 程序将 0xff 解释为 -1 还是 ~0 是系统相关的?

C++ 中填充 0xff 时检查整数的可移植方式究竟是什么?是否应该针对 unsigned int 或 signed int 进行检查?我很困惑...

~0

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

int all_the_ones = ~0;

然后你会在包含 all_the_ones

值的内存部分得到 11111111111111111111111111111111

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

无论如何,对于 0xff 等于 ~0 的 int,有问题的 int 需要是 8bit/1byte,又名 char

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

a 等于 255,b 等于 -1

记忆中他们都是11111111

我不明白你为什么想知道 0xff 是否存储在一个 int 中,但与上面的 ab 进行比较应该可行。