2017-01-21 14 views
-2

Я видел некоторый код вида:Почему 0xff равной отрицательный 0 в 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) {...} 

поле на этом классе Object является тип без знака внутр. Я смущен, что почему 0xff можно оценить равным ~ 0, на unsigned int? Я видел еще один post, говорящий о 0xff равен -1 на системе дополнений 2, и нашел еще один post, который, я думаю, означает, что, если программа C++ интерпретирует 0xff как -1 или ~ 0, зависит от системы?

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

+8

'~ 0' не является отрицательным 0. –

+0

~ инвертировать каждый бит. – Phil1970

+1

Нет отрицательных 0 для целых чисел в большинстве распространенных представлений (дополнение 2). – Phil1970

ответ

3
~0 

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

int all_the_ones = ~0; 

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

0xff наборов 8 бит на 1, так что для 32-битных Int было бы 00000000000000000000000011111111

Во всяком случае, для 0xff равным ~ 0 на ИНТ ИНТ в вопросе должны быть 8bit/1 байт, иначе char

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

дало бы равным 255 и б равно -1

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

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

+0

Спасибо, я просто неправильно понял весь знак lol ... – Superziyi

+0

рад помочь ^^ – ScegfOd