Question

Je l'ai toujours utilisé des flux, printf, string (x) ou quelle que soit la langue en question a proposé de convertir les types numériques à une chaîne ou à l'arrière. Cependant, je ne l'ai jamais vraiment considéré comment cela se fait réellement. Je cherchai autour de Google, mais tous les résultats ne sont que d'utiliser ces méthodes varie, et non pas comment la conversion est vraiment fait dans les coulisses: (

Pour les entiers en utilisant binaire, octal et hexadécimal semble assez simple puisque chaque « chiffre » dans la chaîne représente un groupe ensemble de bits (par exemple, pour les 2 chiffres hexadécimaux que je connais son xxxxyyyy), pour que je puisse le faire avec des changements de bits et en prenant un chiffre à la fois, par exemple pour la chaîne hexadécimale 0xFA20 la valeur est "(15 << 12) | (10 << 8) | (2 << 4) | (0 << 0)".

entiers décimaux sont plus difficiles depuis la base 10 ne correspond pas à la base 2 comme ça et si un bit peut effectuer plus d'un chiffre décimal faisant la conversion dans les deux sens ... plus complexe

En ce qui concerne les nombres à virgule flottante Je n'ai vraiment aucune idée. Je suppose que les parties entières et fractions peuvent être considérés séparément ou quelque chose? Qu'en est-il comme une exponentielle, un certain nombre de chiffres significatifs ou le nombre ensemble de décimales?

Était-ce utile?

La solution

conversions décimales sont un peu plus lent, mais pas vraiment beaucoup plus complexe. look Let à la conversion hexadécimal un peu plus comme nous aurions probablement écrire dans le code réel. Juste par exemple, en C ++ que vous pourriez faire quelque chose de conversion comme ceci:

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]);
}

En ce moment, cependant, qui a un certain nombre de magie. Débarrassons-nous d'entre eux:

const int base = 16;

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

Dans le processus de se débarrasser de ces numéros de magie, nous avons également fait la routine presque universelle - si l'on change la valeur de la « base », le reste de la routine fonctionne toujours, et convertit l'entrée spécifié base. Essentiellement, le seul autre changement que nous devons faire est d'ajouter plus au tableau « chiffres » si nous voulons des bases de soutien de plus de 16.

ne tient pas compte aussi quelques choses pour la simplicité. Bien évidemment, si le nombre est négatif, vous généralement définir un indicateur, converti à un nombre positif, et à la fin, si le drapeau a été mis, mettez un « - » dans la chaîne). Avec le complément de 2, il y a un cas de coin pour le nombre maximum négatif, ce qui ne peut pas être convertie en un nombre positif (sans conversion à un type avec plus de portée). En général, vous traitez que par la promotion de la plupart des types. Pour votre plus grand type entier (que vous ne pouvez pas promouvoir), il est généralement plus facile à un peu dur code une valeur.

En principe, virgule flottante est pas tout à fait différent de beaucoup - vous faites encore essentiellement des manipulations mathématiques pour générer un chiffre à la fois. En fait, il est plus complexe simplement parce que vous avez généralement à traiter deux formats différents (au moins un format « de base » à virgule flottante et une sorte de « scientifique »), ainsi que des variables pour la largeur de champ et la précision. Au moment où vous avez fait affaire avec cela, vous vous retrouvez avec quelques centaines de lignes de code ou si - pas un montant particulièrement scandaleux, mais sans doute un peu plus logique d'inclure ici

.

Autres conseils

  

Je cherchai autour sur Google, mais tous les résultats ne sont que d'utiliser ces méthodes varie, et non pas comment la conversion est vraiment fait dans les coulisses: (

Pour des raisons de performance, la conversion d'une représentation à l'autre (en particulier à virgule flottante / de conversion de nombre entier) est souvent une instruction de CPU de bas niveau et est mis en oeuvre au niveau du processeur. Voilà pourquoi vous ne voyez pas généralement il réimplémenté dans les bibliothèques ou à un niveau de langue.

Cela est particulièrement vrai dans le monde du traitement des signaux, par exemple, où vous voulez prendre une forme d'onde et le convertir en une valeur entière discrète dans une certaine plage.

Pour les entiers, vous pouvez trouver reste de la division, ce dernier chiffre est, diviser par 10, trouvé résiduel modulaire - c'est un, mais le dernier chiffre, et ainsi de suite. nombres à virgule flottante sont construits en deux parties - chiffres significatifs et exposant, à savoir nombre = significant.digits * (base exposant ^), où la base peut être de 10, 2, ou tout autre numéro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top