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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top