我看到一些代码看起来像这样:
Object *area = new Object[n];
memset(area, 0xff, sizeof(Object) * count);
因此,这将使用位1填充Object数组的每个字段。然后,通过检查〜0(负零),有多个位置检查对象的字段是否尚未填充:
const unsigned int NULL_INDEX = ~0;
...
if(object.field == NULL_INDEX) {...}
该Object类上的字段是unsigned int类型。我很困惑,为什么0xff可以在unsigned int上被评估为等于〜0?我在2的补码系统上看到另一个post谈论0xff等于-1,并发现另一个post,我认为这意味着C ++程序是否将0xff解释为-1或〜0是否依赖于系统?
在填充0xff时,C ++中用于检查整数的可移植方式究竟是什么?是应该根据unsigned int还是signed int进行检查?我很困惑......
答案 0 :(得分: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;
等于255,b等于-1
在记忆中,他们都是11111111
我不明白为什么你想知道0xff是否存储在int中,但是与上面的a
或b
进行比较应该有效。