У меня короткий, instr
, который выглядит следующим образом:
1110xxx111111111
Мне нужно вытащить биты 0-9, что я делаю с (instr & 0x1FF)
. Затем это количество сохраняется в новой короткой форме. Проблема в том, что когда это происходит, оно становится 0x0000000111111111
, а не 0x1111111111111111
, как я хочу. Как я могу это исправить? Спасибо!
ИЗМЕНИТЬ
Здесь код:
short instr = state->mem[state->pc];
unsigned int reg = instr >> 9 & 7; // 0b111
state->regs[reg] = state->pc + (instr & 0x1FF);
Это симулятор, который читается в сборке. state
- это машина, regs[]
- регистры, а pc
- адрес текущей команды в mem[]
.
Это нормально, если последние девять бит представляют собой положительное число, но если они представляют -1, они сохраняются как все 1, что интерпретируется как положительное значение моим кодом.