16 бит int
с сегодня не распространены. Вы можете попытаться определить переменную как short
, которая обычно составляет 16 бит. Все зависит от машины, которую вы используете. Вы также можете использовать uint16
, если вы ищете 16-битное целое число.
Похоже, проблема может быть в том, что используемый вами unsigned int
на самом деле не 16 бит, как упомянул Кристиан Гиббонс в комментарии. Когда вы сдвигаете 0010100010011001
влево на 3 цифры, вы в конечном итоге получаете 10100010011001000
, при этом самая левая 1 не удаляется, как вы ожидаете получить 16-битное целое число, тогда, когда вы снова сдвигаетесь вправо, вы получаете добавленную 1, которой не было ожидая.
Вы можете изменить свой код на это, и он должен работать так, как вы ожидали:
uint16_t temp = addr << tag_size;
uint16_t temp1 = temp >> b;
uint16_t setid = temp1 >> tag_size;