Pergunta

Eu assinei números (2s complemento) armazenados em inteiros de 32 bits, e eu quero extrair campos de 16 bits a partir deles. É verdade que se eu extrair o baixo 16 bits a partir de um número assinado de 32 bits, o resultado será correto, desde que os ajustes originais de número (32-bit) em 16 bits?

Para números positivos é trivialmente verdadeira, e parece que para negativos também. Mas isso pode ser comprovado?

Agradecemos antecipadamente

Foi útil?

Solução

Sim, em dois de complementar os bits de sinal estender "todo o caminho" para a esquerda. Quando você lança um assinado curto para um int assinado, em seguida, o número é "sinal estendida" e tem o mesmo valor.

Exemplo: Nibble (-2) = 1110 => Byte(-2) = 1111_1110

Obviamente o oposto é verdade também, se você capturar pelo menos um bit de sinal, em seguida, o valor do número permanece inalterado.

Outras dicas

De minha (segunda) a leitura da sua pergunta, não parece como se você precisa para "extrair" qualquer bits, mas sim converter o número inteiro?

i. fazer algo como isto:

int negative = -4711;
short x = (short) negative;

Neste caso, o compilador irá certificar-se de que, tanto quanto possível de precisão do número original é convertido na atribuição. Este seria o caso mesmo se o hardware subjacente não estava usando 2: s complemento. Se for, então este é susceptível de ser apenas um truncamento, como explicado por Motti.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top