Путаница с оператором C ~ (поразрядно Not) и сравнение переменных типа char - PullRequest
9 голосов
/ 29 октября 2011

Используя "обычный C", я хочу сравнить два 8-битных байта, чтобы определить, является ли второе побитовым дополнением первого.Например, если Byte1 является двоичным 00001111 (15 в десятичном формате), я хочу проверить, является ли Byte2 двоичным 11110000 (240 в десятичном).Я ожидал сделать это, используя беззнаковые символы для представления байтов, битовый оператор NOT "~" и простой тест if (==).

Может кто-нибудь объяснить мне, почему следующий код не работает(т.е. я ожидаю, что он выведет «True», но на самом деле выдает «False».)(==) Сравнительная работа?

Спасибо,

Мартин.

Ответы [ 2 ]

10 голосов
/ 29 октября 2011

Поскольку интегральное повышение приводит к тому, что математика с правой стороны выполняется как int.Если вы присвоите результат обратно char, как unsigned char Z = ~X, эти старшие биты будут снова обрезаны и Y == Z.

5 голосов
/ 29 октября 2011

Оператор ~ приводит к тому, что его операнды повышаются до int перед дополнением.~ 15 - это не 240, а какое-то другое значение, в зависимости от размера целого.

Просто используйте if (X + Y == 255), и оно должно работать.

...