Это вопрос, связанный с стандартом c99, и касается целых рекламных акций и побитовых отрицаний unsigned char.Побитовое отрицание unsigned char
В разделе 6.5.3.3 говорится, что:
Целые акции выполняются на операнд, и результат имеет расширенный тип. Если расширенный типа является типом без знака, то выражение ~ E эквивалентно максимального значения, представимого в этом типа минус Е.
Am I понимание, что правильно, когда я говорю, что это означает, что:
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.
Возможно ли получить надлежащие ожидаемые сравнения символов, где каждый из этих случаев будет оцениваться как истинный?
Прочитайте [в этом ответе] (http://stackoverflow.com/questions/17796041/calculating-ranges-of-data-types-in-c/17796122#17796122) Если '~ 0' является ловушечным представлением, то поведение не определено. –
@GrijeshChauhan: Они неподписанные, представление ловушки в этом случае не имеет значения. см. также сноску 53 в 6.2.6.2, связанную с связанным ответом. – Hasturkun
@Hasturkun: '~ 0' не является неподписанным ... –