Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2494 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Transfert de base 10 en base 16 en C ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Transfert de base 10 en base 16 en C ??

n°325646
eric6337
Posté le 07-03-2003 à 08:29:16  profilanswer
 

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.

mood
Publicité
Posté le 07-03-2003 à 08:29:16  profilanswer
 

n°325651
chrisbk
-
Posté le 07-03-2003 à 08:39:57  profilanswer
 

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)

n°325666
El_gringo
Posté le 07-03-2003 à 09:01:52  profilanswer
 

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 !

n°325667
chrisbk
-
Posté le 07-03-2003 à 09:04:54  profilanswer
 

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

n°325668
eric6337
Posté le 07-03-2003 à 09:05:55  profilanswer
 

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.

n°325669
El_gringo
Posté le 07-03-2003 à 09:08:02  profilanswer
 

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++ ?

n°325670
chrisbk
-
Posté le 07-03-2003 à 09:08:13  profilanswer
 

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]
 

n°325671
eric6337
Posté le 07-03-2003 à 09:13:31  profilanswer
 

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

n°325675
El_gringo
Posté le 07-03-2003 à 09:16:42  profilanswer
 

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++ !

n°325747
Kristoph
Posté le 07-03-2003 à 10:34:20  profilanswer
 

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

mood
Publicité
Posté le 07-03-2003 à 10:34:20  profilanswer
 

n°325761
eric6337
Posté le 07-03-2003 à 10:41:50  profilanswer
 

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

n°325763
chrisbk
-
Posté le 07-03-2003 à 10:42:46  profilanswer
 

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
 

n°325767
leneuf22
Posté le 07-03-2003 à 10:46:51  profilanswer
 

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.

n°325880
western
AJMM
Posté le 07-03-2003 à 12:25:43  profilanswer
 

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 ..."

n°325884
chrisbk
-
Posté le 07-03-2003 à 12:26:37  profilanswer
 

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]

n°325893
western
AJMM
Posté le 07-03-2003 à 12:34:37  profilanswer
 

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.

n°326076
Kristoph
Posté le 07-03-2003 à 15:28:07  profilanswer
 

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

n°326077
chrisbk
-
Posté le 07-03-2003 à 15:28:52  profilanswer
 

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 ?

n°326094
Kristoph
Posté le 07-03-2003 à 15:37:49  profilanswer
 

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.

n°326099
chrisbk
-
Posté le 07-03-2003 à 15:43:01  profilanswer
 

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

n°326104
Kristoph
Posté le 07-03-2003 à 15:49:44  profilanswer
 

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
n°326110
chrisbk
-
Posté le 07-03-2003 à 15:56:07  profilanswer
 

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)
 
 
 

n°326125
Kristoph
Posté le 07-03-2003 à 16:07:35  profilanswer
 

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 ...

n°328016
chrisbk
-
Posté le 10-03-2003 à 08:20:58  profilanswer
 

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....
 
 
 
 
 
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Transfert de base 10 en base 16 en C ??

 

Sujets relatifs
en php/mysql avoir accés à 1 base de donnée sur 1 autre hébergement?apres avoir apris les base du c++..
mon fichier base de données sous Linux[c++] transfert de fichier via un socket
[Mysql] Recuperer une base de données que l'on vient d'effacer...Transfert SGDB - SGDB d'un autre type
aarrrfff !! modif sur base de registre 98se[Oracle][Pro*C] Requetes de base
Probleme de connexion avec php sur une base de donnees[c++] comment convertir un int en base 2, 4 et 8 ?
Plus de sujets relatifs à : Transfert de base 10 en base 16 en C ??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR