Может кто-нибудь объяснить мне, почему маска не смещена вправо? Вы можете использовать что-либо вместо этого 1, и результат будет таким же.Почему этот побитовый сдвиг-право не работает?
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
Может кто-нибудь объяснить мне, почему маска не смещена вправо? Вы можете использовать что-либо вместо этого 1, и результат будет таким же.Почему этот побитовый сдвиг-право не работает?
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
Это проблема типа. Если вы бросили 0 до знака это будет хорошо:
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
Редактировать в комментариях: или использовать неподписанные буквальное обозначение, которое является гораздо более емким. :)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
То, что происходит ~0
является ИНТ со всеми установленными битами (-1
). Теперь вы правы сдвигаетесь на 1
; поскольку это -1
, расширение знака поддерживает самый высокий бит, поэтому он остался подписанным (это не то, что вы ожидали). Затем он преобразуется в unsigned, как вы ожидаете.
~ 0 - это строка из них. Оператор >> сдвигает их, и в значении знака он сдвигает их в биты более высокого порядка. Таким образом, вы можете переместить все, что хотите, результат не изменится.
Попробуйте это:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
Правая часть задания рассматривается как знаковое количество, если не бросить его, что означает, что вы видели знаковое без броска. (Я также изменил ваш оператор печати, чтобы отобразить число в шестнадцатеричном формате, которое мне легче декодировать.)
Или просто: «unsigned mask = ~ 0u >> 1;» Суффикс u обозначает целое число без знака. – Skizz
Ах да, это тоже. – chaos
Бинго! Этот вопрос был трудным для меня, потому что я не знал о том, что неявный тип происходит. Раньше ответы не делали этого понятным. –