Estrazione di un campo bit da un numero con segno
-
06-07-2019 - |
Domanda
Ho numeri con segno (complemento a 2s) memorizzati in numeri interi a 32 bit e desidero estrarre da essi campi a 16 bit. È vero che se estraggo i 16 bit bassi da un numero con segno a 32 bit, il risultato sarà corretto finché il numero originale (32 bit) si adatta a 16 bit?
Per i numeri positivi è banalmente vero, e lo sembra anche per i negativi. Ma può essere provato?
Grazie in anticipo
Soluzione
Sì, nel complemento a due i bit di segno si estendono "completamente". a sinistra. Quando lanci un short firmato con un int firmato, il numero è " sign extended " e ha lo stesso valore.
Esempio: Nibble
(-2) = 1110 = > Byte (-2) = 1111_1110
Ovviamente è vero anche il contrario, se acquisisci almeno un bit di segno, il valore del numero rimane invariato.
Altri suggerimenti
Dalla mia (seconda) lettura della tua domanda, non sembra che tu abbia bisogno di " estrarre " qualche bit, ma piuttosto convertire l'intero numero?
vale a dire. fai qualcosa del genere:
int negative = -4711;
short x = (short) negative;
In questo caso, il compilatore si assicurerà che il più possibile della precisione del numero originale venga convertito nell'assegnazione. Questo sarebbe il caso anche se l'hardware sottostante non utilizzava il complemento 2: s. Se lo è, allora è probabile che questo sia solo un troncamento, come spiegato da Motti.