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

时间:2017-01-21 01:40:23

标签: c++ bit twos-complement ones-complement

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

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进行检查?我很困惑......

1 个答案:

答案 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中,但是与上面的ab进行比较应该有效。