为什么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 中,但与上面的 a
或 b
进行比较应该可行。
我看到一些代码是这样的:
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 中,但与上面的 a
或 b
进行比较应该可行。