Когда unsigned int
значения сравниваются с int
значения, значение int
неявно преобразуются в unsigned int
типа. Результатом этого преобразования является congruent с исходным значением по модулю 2 N, где N
- это число битов формирования значения в unsigned int
. Этот модуль равен UINT_MAX + 1
.
По этой причине инициализации
unsigned int x = -1;
инициализирует x
с каким-то значение без знака congruent к -1
по модулю UINT_MAX + 1
. Кстати, это не что иное, как UINT_MAX
. Это значение имеет 1
в каждом бите формирования значения объекта unsigned int
. Он работает таким образом с любым беззнаковым типом.
Выражение ~0
оценивается в области signed int
типа, а затем y
неявно преобразуется в unsigned int
в x == y
сравнения. По-видимому, на вашей платформе конверсия производит то же значение unsigned int
со всеми битами формирования значений, установленными на 1
. Отсюда и равенство.
Инициализация
unsigned int x = -4;
инициализирует x
с каким-то значение без знака congruent к модулю -4
UINT_MAX + 1
. В сравнении x == -4
правая часть преобразуется в неподписанный тип по тем же правилам. Отсюда и равенство.
без знака не может быть отрицательным :) , когда вы написали слово «без знака» не думаю, что это значит? –
Ответ на ваш вопрос уже приведен в вашем примере. – dari
Я имею в виду, как -1 представляется в двоичной форме. Какова логика, что -1 и 1 одинаковы. –