2009-02-24 4 views

ответ

25

Это проблема типа. Если вы бросили 0 до знака это будет хорошо:

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

Редактировать в комментариях: или использовать неподписанные буквальное обозначение, которое является гораздо более емким. :)

unsigned mask = ~0u >> 1; 
printf("%u\n", mask); 
+2

Или просто: «unsigned mask = ~ 0u >> 1;» Суффикс u обозначает целое число без знака. – Skizz

+0

Ах да, это тоже. – chaos

+1

Бинго! Этот вопрос был трудным для меня, потому что я не знал о том, что неявный тип происходит. Раньше ответы не делали этого понятным. –

13

Sign extension

То, что происходит ~0 является ИНТ со всеми установленными битами (-1). Теперь вы правы сдвигаетесь на 1; поскольку это -1, расширение знака поддерживает самый высокий бит, поэтому он остался подписанным (это не то, что вы ожидали). Затем он преобразуется в unsigned, как вы ожидаете.

2

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

4

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

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

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

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

  • Нет связанных вопросов^_^