Вопрос

Может ли кто-нибудь объяснить мне, почему маска вообще не сдвинута вправо?Вы можете использовать что угодно вместо этого 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 является int со всеми установленными битами (-1).Теперь ты справа сдвигаешься на 1;поскольку это -1, расширение sign сохраняет установленный самый высокий бит, поэтому оно остается подписанным (это не то, что вы ожидали).Затем он преобразуется в неподписанный, как вы и ожидаете.

Попробуй это:

unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);

RHS присваивания обрабатывается как количество со знаком, если вы не приведете его, что означает, что вы видели расширение знака без приведения.(Я также изменил ваше заявление о печати, чтобы отобразить число в шестнадцатеричном формате, который мне легче расшифровать.)

~0 - это строка из единиц.Оператор >> сдвигает их, и в значении со знаком он сдвигает единицы в биты более высокого порядка.Таким образом, вы можете сдвигать все, что хотите, результат не изменится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top