2013-09-23 3 views
3

Это вопрос, связанный с стандартом 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.

Возможно ли получить надлежащие ожидаемые сравнения символов, где каждый из этих случаев будет оцениваться как истинный?

+0

Прочитайте [в этом ответе] (http://stackoverflow.com/questions/17796041/calculating-ranges-of-data-types-in-c/17796122#17796122) Если '~ 0' является ловушечным представлением, то поведение не определено. –

+0

@GrijeshChauhan: Они неподписанные, представление ловушки в этом случае не имеет значения. см. также сноску 53 в 6.2.6.2, связанную с связанным ответом. – Hasturkun

+2

@Hasturkun: '~ 0' не является неподписанным ... –

ответ

2

~uc имеет тип int (значение 0xFFFF). ucInverted имеет тип unsigned char (значение 0xFF), которое затем составляет int (значение 0x00FF). Таким образом, они не равны.

Я думаю, вы могли бы сделать if ((unsigned char)~uc == ucInverted). Оба операнда будут по-прежнему подвергаться продвижению по службе, но перед продвижением они будут иметь одинаковые значения.

+0

Мне просто кажется совершенно нелогичным, что вы должны отбросить неподписанный символ обратно к unsigned char, чтобы правильно сравнить его с unsigned char. Или это только я? – Kenneth

+0

@ Kenneth: Как только один признает, что '' 'вызывает продвижение типа, остальное полностью логично;) –

+1

' ~ uc', скорее всего, типа 'signed int'. –

Смежные вопросы