Domanda

Ho sempre usato torrenti, printf, stringa (x) o qualsiasi altra cosa la lingua in questione ha offerto per convertire tipi numerici in una stringa o alla schiena. Tuttavia non ho mai realmente considerato come questo viene effettivamente fatto. Ho cercato in giro su Google, ma tutti i risultati sono semplicemente usare quelli varia metodi, e non come la conversione è davvero fatto dietro le quinte: (

Per gli interi utilizzando binario, ottale ed esadecimale sembra abbastanza semplice poiché ogni "cifre" nella stringa rappresenta un gruppo di inserimento di bit (ad esempio per le 2 cifre esadecimali so sua xxxxyyyy), così ho potuto farlo con turni bit e prendendo una cifra alla volta, ad esempio per la stringa esadecimale 0xFA20 il valore è "(15 << 12) | (10 << 8) | (2 << 4) | (0 << 0)".

interi decimali sono più difficili in quanto base 10 non mappa di base 2 così e così un bit può effettuare più di una cifra decimale rendendo conversione in entrambi i modi più complesso ...

Per quanto riguarda i numeri in virgola mobile Io davvero non hanno alcuna idea. Credo che le parti intere e frazionali possono essere considerate separatamente o qualcosa del genere? Che dire come un esponenziale, un determinato numero di cifre significative o determinato numero di cifre decimali?

È stato utile?

Soluzione

conversioni

??decimali sono un po 'più lento, ma non è davvero molto più complessa. Diamo un'occhiata alla conversione esadecimale un po 'più come avremmo probabilmente scrivere nel codice vero e proprio. Solo per esempio, in C ++ si potrebbe fare la conversione qualcosa di simile:

char digits[] = "0123456789abcdef";
std::string result;

int input = 0xFA20;

while (input) {
    int digit = input & 0xf; // or: digit = input % 0xf;
    input >>= 4;             // or: input /= 16;
    result.push_front(digits[digit]);
}

In questo momento, però, che ha alcuni numeri magici. Cerchiamo di sbarazzarsi di loro:

const int base = 16;

while (input) { 
    int digit = input % (base - 1);
    input /= base;
    result.push_front(digits[digit]);
}

Nel processo di sbarazzarsi di quei numeri magici, abbiamo anche fatto la routine quasi universale - se cambiamo il valore di 'base', il resto della routine funziona ancora, e converte l'ingresso al specificato base. In sostanza l'unico altro cambiamento di cui abbiamo bisogno di fare è l'aggiunta di più per la matrice "cifre", se vogliamo basi di appoggio maggiore di 16.

Questo ignora anche alcune cose per semplicità. La maggior parte, ovviamente, se il numero è negativo, in genere si imposta una bandiera, convertito ad un numero positivo, e alla fine, se è stato impostato il flag, mettete un '-' nella stringa). Con complemento a 2 c'è un caso d'angolo per il numero massimo negativo, che non può essere convertito in un numero positivo (senza conversione a un tipo con più gamma). In genere si tratta con che promuovendo maggior parte dei tipi. Per la vostra più grande tipo intero (che non è possibile promuovere) di solito è più facile da solo hard-codice che un valore.

In linea di principio virgola mobile non è un bel po 'diverso - ancora fondamentalmente fare manipolazioni matematiche per generare una cifra alla volta. In realtà, diventa più complesso, semplicemente perché si ha tipicamente a che fare con un paio di formati diversi (almeno una virgola mobile "di base" e una sorta di formato "scientifico"), così come le variabili per la larghezza del campo e precisione. Con il tempo hai affrontato con questo, si finisce con poche centinaia di righe di codice o giù di lì - importo non particolarmente scandaloso, ma probabilmente un po 'più di senso per includere qui

.

Altri suggerimenti

  

Ho cercato in giro su Google, ma tutti i risultati sono semplicemente usare quelli varia metodi, e non come la conversione è davvero fatto dietro le quinte: (

Per motivi di prestazioni, la conversione da una rappresentazione all'altra (conversioni particolarmente virgola mobile / interi) è spesso un'istruzione CPU basso livello ed è implementata a livello di processore. È per questo che non si vede in genere si re-implementate nelle biblioteche o in un livello di linguaggio.

Questo è particolarmente comune nel mondo di elaborazione del segnale, per esempio, dove si vuole prendere una forma d'onda e convertirlo in un valore intero discreta in un certo intervallo.

Per gli interi si possono trovare divisione resto, questa è l'ultima cifra, dividere per 10, ha trovato modulare residua - questo è uno, ma l'ultima cifra, e così via. numeri in virgola mobile sono realizzati in due parti - cifre significative e esponente, cioè number = significant.digits * (base ^ esponente), dove base può essere di 10, 2, o altro numero.

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