Что происходит ~0 - это int со всеми установленными битами (-1). Теперь вы сдвигаетесь вправо на 1; так как он -1, расширение знака сохраняет самый старший бит, поэтому он остался подписанным (это не то, что вы ожидали). Затем он преобразуется в unsigned, как вы ожидаете.
RHS присваивания рассматривается как подписанное количество, если вы не произнесете его, а это означает, что вы видите расширение знака без трансляции. (Я также изменил ваш оператор печати, чтобы отобразить число в шестнадцатеричном формате, которое мне легче декодировать.)
Ответ 4
~ 0 - строка из них. Оператор → сдвигает их, и в значении знака он сдвигает их в биты более высокого порядка. Таким образом, вы можете переместить все, что хотите, результат не изменится.