Это вопрос, относящийся к стандарту c99 и касающийся продвижения целых чисел и побитового отрицания беззнакового символа.
В разделе 6.5.3.3 говорится, что:
Целочисленные продвижения выполняются над операндом, и результат имеет продвигаемый тип. Если продвигаемый тип является типом без знака, выражение ~E эквивалентно максимальному значению, представленному в этом типе, за вычетом E.
Правильно ли я понимаю, когда я говорю это, это означает, что:
unsigned int ui = ~ (unsigned char) ~0; // ui is now 0xFF00.
Мое замешательство связано с обсуждением с коллегой, где он видит следующее поведение нашего компилятора.
unsigned char uc = 0;
unsigned char ucInverted = ~0;
if( ~uc == ~0 ) // True, obviously
if( ~ucInverted == ~(~0) ) // False as it evaluates to: 0xFF00 == 0x0000
if( ~uc == ucInverted ) // False as it evaluates to: 0xFFFF == 0x00FF
if( uc == ~ucInverted ) // False as it evaluates to: 0x0000 == 0xFF00
Это поведение подтверждается с помощью gcc.
Можно ли получить правильные ожидаемые сравнения символов, где каждый из этих случаев будет оцениваться как истинный?
~0
является представлением ловушки , то поведение не определено. - person Grijesh Chauhan   schedule 23.09.2013~0
не без подписи... - person Oliver Charlesworth   schedule 23.09.2013