Причина (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
Вы передаете '255'' '' ', который является' signed', отсюда '-1'. –
@ Пересекающиеся биты: но это означало бы, что дополнение происходит после операции правого сдвига. Оба типа литья и дополнения имеют одинаковый приоритет. – monty
Misread. Игнорируйте мой комментарий. –