Signe étendre neuf nombre de bits en C

J'ai un court, instr, qui ressemble à ceci:

1110xxx111111111

J'ai besoin de sortir de bits de 0 à 9, ce que je fais avec (instr & 0x1FF). Cette quantité est ensuite stockée dans un nouveau court. Le problème est que lorsque cela se produit, il devient 0x0000000111111111, pas 0x1111111111111111 comme je veux. Comment puis-je résoudre ce problème? Merci!

MODIFIER

Voici le code:

short instr = state->mem[state->pc];
unsigned int reg = instr >> 9 & 7; //0b111
state->regs[reg] = state->pc + (instr & 0x1FF);

C'est un simulateur qui lit dans l'assemblée. state est la machine, regs[] sont les registres et pc est l'adresse de l'instruction courante dans mem[].

C'est très bien si les neuf derniers bits représentent un nombre positif, mais si ils représentent -1, il est enregistré comme toutes les 1, ce qui est interprété comme une valeur positive par mon code.

Pas sûr de comprendre la question ou le processus que vous utilisez. Soins de partager le code que vous utilisez pour obtenir ces résultats?
Ce n'est pas clair, qui devrait devenir 0x1111111111111111?

OriginalL'auteur Chris Long | 2011-04-28