Я видел некоторый код, похожий на этот:
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? Я весьма озадачен…
~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
выше должно работать.
Других решений пока нет …