bit — почему 0xff равно отрицательному 0 в переполнении стека

Я видел некоторый код, похожий на этот:

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 для unsigned int? Я видел другую сообщение говоря о 0xff равно -1 на 2-й системе комплемента, и нашел другой сообщение что, я думаю, означает, что программа на C ++ интерпретирует 0xff как -1 или ~ 0 в зависимости от системы?

Что именно является переносимым способом в C ++ для проверки целого числа при заполнении 0xff? Должно ли это быть проверено против unsigned int или подписанного int? Я весьма озадачен…

-2

Решение

~0

Просто устанавливает все биты в 1.
Например, если у вас 32-битное int и вы используете

int all_the_ones = ~0;

тогда вы получите 11111111111111111111111111111111 в части памяти, содержащей значение all_the_ones

0xff устанавливает 8 бит в 1, поэтому для 32-битного int это будет 00000000000000000000000011111111

В любом случае, для 0xff, равного ~ 0 для целого числа, рассматриваемый тип int должен быть 8 бит / 1 байт, иначе char

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

Дал бы равный 255 и б, равный -1

В памяти они оба 11111111

Я не понимаю, почему вы хотите знать, если 0xff был сохранен в int, но по сравнению с a или же b выше должно работать.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]