2015-06-02 3 views
4

Я пытался вычислить пределы типа char, используя следующее выражение.расчет пределов char без использования макроопределений

(char)(~(unsigned char)0 >> 1) 

Я ожидал, что это будет равно 127, но ответ будет равен -1.
Затем я заменил это выражение.

~(unsigned char)0 

по

(unsigned char)~0 

Это один дает правильный ответ Так как же эти две разные

+0

Вы передаете '255'' '' ', который является' signed', отсюда '-1'. –

+0

@ Пересекающиеся биты: но это означало бы, что дополнение происходит после операции правого сдвига. Оба типа литья и дополнения имеют одинаковый приоритет. – monty

+0

Misread. Игнорируйте мой комментарий. –

ответ

5

Причина (char)((unsigned char)~0 >> 1) является 127 очевидна - Вы 0xFFFFFFFF, бросайте его неподписанные символ , вы получаете 0xFF, сдвигаетесь на один, и у вас есть 0x7F или 127.

Странно, почему первый ошибочен: вы бросаете ноль в unsigned char. Затем вы дополняете это. Но оператор ~ фактически способствует его операнд:

Целые акции выполняются на операнд, и результат имеет расширенный тип.

(раздел n1570 6.5.3.3)

Если INT может представлять все значения исходного типа (как ограниченное по ширине, для битового поля), значение превращают в INT; в противном случае он преобразуется в unsigned int. Они называются целыми акциями. Все другие типы не меняются при целочисленных поощрениях

(n1570 раздел 6.3.1.1)

Поскольку int может хранить все значения в unsigned char, результат является Int. Который вы смещаете на один, а затем бросаете, в результате получается -1

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