Ho un breve, instr
, che assomiglia a questo:Segno estendere un numero nove bit in C
1110xxx111111111
ho bisogno di tirare fuori i bit 0-9, cosa che faccio con (instr & 0x1FF)
. Questa quantità viene quindi memorizzata in un nuovo corto. Il problema è che quando ciò si verifica, diventa 0x0000000111111111
, non 0x1111111111111111
come voglio. Come posso risolvere questo? Grazie!
EDIT
Ecco il codice:
short instr = state->mem[state->pc];
unsigned int reg = instr >> 9 & 7; // 0b111
state->regs[reg] = state->pc + (instr & 0x1FF);
Questo è un simulatore che legge in assemblea. state
è la macchina, regs[]
sono i registri e pc
è l'indirizzo dell'istruzione corrente in mem[]
.
Questo va bene se gli ultimi nove bit rappresentano un numero positivo, ma se rappresentano -1, viene memorizzato come tutti gli 1, che è interpretato come un valore positivo dal mio codice.
Non sono sicuro ho capito la domanda o il processo che si sta utilizzando. Ti interessa condividere il codice che stai utilizzando per ottenere questi risultati? – joce
Questo non è chiaro, chi dovrebbe diventare '0x1111111111111111'? – MByD