Transfert de base 10 en base 16 en C ??

Transfert de base 10 en base 16 en C ?? - C++ - Programmation

Marsh Posté le 07-03-2003 à 08:29:16    

Bonjour à tous,  
 
Mon amie est en train de développer un projet en C. Elle doit faire, entre autre, un transfert de base 10 (décimale) en base 16 (hexadécimale). Est-ce qu'il existe une fonction en C pour cela ?  
 
Merci par avance. Bon courage à tous.  
Bye.

Reply

Marsh Posté le 07-03-2003 à 08:29:16   

Reply

Marsh Posté le 07-03-2003 à 08:39:57    

de facon super crade :
 

Code :
  1. char temp[32]
  2. sprintf(temp,"%x",monIntEnBase10);
  3. scanf(temp,"%x",&monEntierEnBase16);


 
 
(c super crados, j'en suis bien conscient)

Reply

Marsh Posté le 07-03-2003 à 09:01:52    

chrisbk a écrit :

de facon super crade :
 

Code :
  1. char temp[32]
  2. sprintf(temp,"%x",monIntEnBase10);
  3. scanf(temp,"%x",&monEntierEnBase16);


 
 
(c super crados, j'en suis bien conscient)
 


 
à la limite "sscanf", pas "scanf", cela dit, c'est clair que c'est crade !

Reply

Marsh Posté le 07-03-2003 à 09:04:54    

El_gringo a écrit :


 
à la limite "sscanf", pas "scanf", cela dit, c'est clair que c'est crade !


 
oups oui, mea culpa
 
je crois qu'il y a une autre fonction pour ce genre de plaisanterie mais j'm'en rapelle pu :D

Reply

Marsh Posté le 07-03-2003 à 09:05:55    

Merci d'ores et déjà à vous 2.
 
Je ne suis pas en mesure d'essayer cela pour le moment.
En C++, j'ai trouvé la fonction _itoa mais il me faut ça en C. Cela aurait si simple de l'utiliser...
 
Merci.

Reply

Marsh Posté le 07-03-2003 à 09:08:02    

eric6337 a écrit :

Merci d'ores et déjà à vous 2.
 
Je ne suis pas en mesure d'essayer cela pour le moment.
En C++, j'ai trouvé la fonction _itoa mais il me faut ça en C. Cela aurait si simple de l'utiliser...
 
Merci.


 
Ben, itoa, c'est du C, où t'as vu que c'était du C++ ?

Reply

Marsh Posté le 07-03-2003 à 09:08:13    

chrisbk a écrit :

de facon super crade :
 

Code :
  1. char temp[32]
  2. sprintf(temp,"%x",monIntEnBase10);
  3. scanf(temp,"%x",&monEntierEnBase16);


 
 
(c super crados, j'en suis bien conscient)
 


 
mais dites moi, apres ce superbe calcul, monIntEnBase10 ne serait il pas egal a monEntierEnBase16 ? [:meganne]
 
je tiens une de ces formes ce matin :sol: [:leg9]
 

Reply

Marsh Posté le 07-03-2003 à 09:13:31    

J'ai bien indiqué _itoa... J'ai essayé ça, enfin mon amie, sous Unix et c'est pas reconnu ?!? Sous VS C++, pas de problème.
 
Merci encore

Reply

Marsh Posté le 07-03-2003 à 09:16:42    

eric6337 a écrit :

J'ai bien indiqué _itoa... J'ai essayé ça, enfin mon amie, sous Unix et c'est pas reconnu ?!? Sous VS C++, pas de problème.
 
Merci encore


 
ha, ouais, c normal, c'est une fonction spécifique à windows. Surement pas une fonction C++ !

Reply

Marsh Posté le 07-03-2003 à 10:34:20    

Je rappelle aux personnes ici presentes que la notion de base 10 ou base 16 n'a de sens que pour la convertion en chaine. Donc, quand une personne demande a convertir un nombre d'une base à une autre, il faut supposer qu'il dispose d'une chaine de caracteres decrivant  ce meme nombre dans la premiere base et qu'il veut ecrire ce nombre dans une autre chaine dans la nouvelle base.
 
Le code de crisbk était donc presque parfait ;)
 

Code :
  1. const char * nombreenbase10;
  2. char resultat[32];
  3. int monEntierEnBase10;
  4. scanf(nombreenbase10,"%d",&monEntierEnBase10);
  5. sprintf(resultat,"%x",monEntierEnBase16);


 
PS : pafois, quand je vois ce genre de question qui reviens si souvent, j'ai l'impression que la personne veut convertir un int en base 10 vers un int en base16 :D

Reply

Marsh Posté le 07-03-2003 à 10:34:20   

Reply

Marsh Posté le 07-03-2003 à 10:41:50    

Salut Kristoph,
 
Merci déjà. Ta remarque est judicieuse mais je ne suis pas à ce point là, comment les valeurs a,b,c,d,e et f peuvent être des int ???  :) !!!
 
Je vais essayer chez moi dès que je le peux...
 
Merci encore

Reply

Marsh Posté le 07-03-2003 à 10:42:46    

eric6337 a écrit :

Salut Kristoph,
 
Merci déjà. Ta remarque est judicieuse mais je ne suis pas à ce point là, comment les valeurs a,b,c,d,e et f peuvent être des int ???  :) !!!
 
Je vais essayer chez moi dès que je le peux...
 
Merci encore


 
tu sais, ton int a la base, il est pas code en decimal mais en binaire. Les decimal/hexa c'est juste une question d'affichage a l'ecran
 

Reply

Marsh Posté le 07-03-2003 à 10:46:51    

Exemple tout bête :
 
0x10 = 16
 
Si ton int = 16, il est aussi égal à 0x10, il n'y a donc aucun calcul à faire !
 
Comme le dit chrisbk, tout est une question d'affichage.

Reply

Marsh Posté le 07-03-2003 à 12:25:43    

Kristoph a écrit :


Code :
  1. char resultat[32];




C'est une maladie, d'allouer systèmatiquement des buffers de 32 octets, (presque) 3 fois trop grand que nécessaire? Et après, on va dit: "Merde, ce programme rame à mort ..."

Reply

Marsh Posté le 07-03-2003 à 12:26:37    

western a écrit :


C'est une maladie, d'allouer systèmatiquement des buffers de 32 octets, (presque) 3 fois trop grand que nécessaire? Et après, on va dit: "Merde, ce programme rame à mort ..."


 
 
fichtre, 32 octets sur la pile qui ne vont exister que le tps de l'appel de cette fonction, mais quel drame [:totoz]

Reply

Marsh Posté le 07-03-2003 à 12:34:37    

chrisbk a écrit :


fichtre, 32 octets sur la pile qui ne vont exister que le tps de l'appel de cette fonction, mais quel drame [:totoz]


 :lol: oui, en plus, les machines actuellement sont tellement puissantes, elles ont tellement de mémoire, etc. qu'il est possible d'allouer des buffers de 1024 octets au lieu 256, par exemple, et le fonctionnement ne ralentie même pas ... Le problème plustard est que dans un système plus complexe (multithreadé, etc.), on alloue à tour de bras les octets et on pleure car il faut acheter de la mémoire, un nouveau proc, etc.

Reply

Marsh Posté le 07-03-2003 à 15:28:07    

western a écrit :


C'est une maladie, d'allouer systèmatiquement des buffers de 32 octets, (presque) 3 fois trop grand que nécessaire? Et après, on va dit: "Merde, ce programme rame à mort ..."


 
Tu as raison, on va passer par std::string, ça ira surement plus vite et ce sera plus econome en mémoire. Ou mieux encore, on va definir une grosse variable globale char tampon[32] que tout le monde se partagera. Comme ça, plus de temps d'allocation :D

Reply

Marsh Posté le 07-03-2003 à 15:28:52    

Kristoph a écrit :


 
Tu as raison, on va passer par std::string, ça ira surement plus vite et ce sera plus econome en mémoire. Ou mieux encore, on va definir une grosse variable globale char tampon[32] que tout le monde se partagera. Comme ça, plus de temps d'allocation :D


 
y en a t-il seulement ?

Reply

Marsh Posté le 07-03-2003 à 15:37:49    

Si ta fonction n'a pas de variables locales, tu n'as en général pas besoin de déplacer le pointer de pile et donc tu ecconomise 2 instructions assembleur.

Reply

Marsh Posté le 07-03-2003 à 15:43:01    

Kristoph a écrit :

Si ta fonction n'a pas de variables locales, tu n'as en général pas besoin de déplacer le pointer de pile et donc tu ecconomise 2 instructions assembleur.


 
bah, economiser un sub et deux movs c quand meme pas ca qui change grand chose :d

Reply

Marsh Posté le 07-03-2003 à 15:49:44    

chrisbk a écrit :


 
bah, economiser un sub et deux movs c quand meme pas ca qui change grand chose :d


 
Pas un sub et deux movs. Juste 2 add/sub.

Code :
  1. ; allocation de 32 octets sur la pile :
  2. add esp,32
  3. ;liberation des 32 octets alloues :
  4. add esp,-32


 
Edit : ajout de :D qui manquait


Message édité par Kristoph le 07-03-2003 à 15:50:11
Reply

Marsh Posté le 07-03-2003 à 15:56:07    

Kristoph a écrit :


 
Pas un sub et deux movs. Juste 2 add/sub.

Code :
  1. ; allocation de 32 octets sur la pile :
  2. add esp,32
  3. ;liberation des 32 octets alloues :
  4. add esp,-32


 
Edit : ajout de :D qui manquait


moi je voyais plutot :
 
sub esp,32;  
mov ebp,esp
..
mov esp,ebp
 
(eg tu flingue pas tout ton adressage de variable si tu rappelles une fonction prenant des parametres en cours de route a cause de tes push)
 
(enfin voila quoi :D)
 
 
 

Reply

Marsh Posté le 07-03-2003 à 16:07:35    

Tu veux dire :
 
mov ebp,esp
sub esp,32;  
..
mov esp,ebp
 
Faudrait voir le code assembleur généré pour trouver c'est quoi le plus efficace quand même. Je suis pas convaicu de l'interet de sauver le registre de pile dans un autre registre ...

Reply

Marsh Posté le 10-03-2003 à 08:20:58    

Kristoph a écrit :

Tu veux dire :
 
mov ebp,esp
sub esp,32;  
..
mov esp,ebp
 
Faudrait voir le code assembleur généré pour trouver c'est quoi le plus efficace quand même. Je suis pas convaicu de l'interet de sauver le registre de pile dans un autre registre ...
 


 
euh ouais je me suis merdé.
bah niveau efficacite, ca doit pas changer grand chose. L'interet c'est que tes valeurs sont toujours en ebp - xx (avec xx constant au travers de la fonction) tandis que si tu indexes via esp fo a chaque push que tu fais recalculer tes indices.
Bon tu me diras, c le compilo qui le fait....
 
 
 
 
 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed