2015-07-29 4 views
4

Я действительно не понимаю, почему я должен преобразовать переменную b после инверсия (унарный operator ~). Может ли кто-нибудь объяснить, почему это необходимо?Typecasting Inversion

unsigned char a = 0xFF; 
unsigned char b = 0x00; 

return (a == (~b));    //expected to return 1 but 0 

... 

return (a == (unsigned char)(~b)); //after typecast returns 1 as expected 

ответ

5

Результата ~b имеет расширенный типа int (Вообще результат b с любым другим унарным +, - или ~), так что вам нужен типаж результата.

Из C11 спецификации проекта разделе 6.5.3.3 Унарное арифметический оператор:

Результат ~ оператор является побитовое дополнение его (способствовало) операнд (то есть, каждый бит в результат устанавливается, если и , только если соответствующий бит в преобразованном операнде не установлен). Целевые рекламные акции выполняются в операнде, а результат имеет продвинутый тип. Если промотированный тип является неподписанным типом, выражение ~12 эквивалентно максимальному значению, представляемому в этом типу минус E.

Так,

unsigned char b = 0x00; 
/* ~b = 0xFFFFFFFF (assuming 4 byte int), (unsigned char)~b = 0xFF */ 
+1

Спасибо, я не знал об этом! – user3482407

+0

Я рад, если вам это поможет. –