Почему эти два числа сравниваются как равные и как выполняется сравнение между x и y?
#include <stdio.h>
int main()
{
unsigned int x = -1;
int y = ~0; //type promotion from int to unsigned int
if (x == y)
printf("same");
else
printf("not same");
return 0;
}
Оператор ~ в C ++ (и других C-подобных языках, таких как C и Java) выполняет побитовую операцию NOT — все 1 бит в операнде установлены в 0, а все 0 битов в операнде установлены в 1. Другими словами , это создает дополнение оригинального номера. Для более подробной информации смотрите Вот.
Побитовый оператор НЕ обладает интересным свойством, которое при применении
на числах, представленных дополнением к двум, это изменяет число
подписать, а затем вычесть один (как вы можете видеть в приведенном выше примере).
Если вы проверите, что ~ -оператор делает с y, вот так:
#include <stdio.h>
int main()
{
unsigned int x = -1;
printf("%i\n",x); // treat data as if singed integer
printf("%u\n",x); // treat data is if unsigned integer
int y = ~0; //type promotion from int to unsigned int
printf("%i\n",y);
if (x == y)
printf("same");
else
printf("not same");
return 0;
}
Ты можешь видеть:
Время успеха: 0 память: 16064 сигнал: 0
-1 такой же
Проверять Вот.
Почему это так?
Битовое представление для -1 в целом числе: (см. дополнение двух для деталей)
11111111 11111111 11111111 11111111
Если вы читаете это в целое число без знака
11111111 11111111 11111111 11111111
является наибольшим возможным без знака Int. -1 в unsigned int становится максимальным числом без знака int из-за переноса. Therfore unsigned -1 и int ~ 0 одинаковы.
Других решений пока нет …