[C/C++] passer d'un int a 4 char (representant le nombre)

passer d'un int a 4 char (representant le nombre) [C/C++] - C - Programmation

Marsh Posté le 30-10-2003 à 03:33:25    

ya un fonction pour faire ca ??? sinon je pensait au decalages.........
 
 

Reply

Marsh Posté le 30-10-2003 à 03:33:25   

Reply

Marsh Posté le 30-10-2003 à 05:23:25    

Reformule STP.

Reply

Marsh Posté le 30-10-2003 à 07:49:27    

int i = 1234;
char cTmp[4];
 
sprintf(cTmp, "%d", i);


Message édité par fodger le 30-10-2003 à 08:16:38
Reply

Marsh Posté le 30-10-2003 à 08:02:21    

ce serait plutot:

Code :
  1. int i = 1234;
  2. char cTmp[4];
  3. sprintf(cTmp, "%4d", i);


 
non?

Reply

Marsh Posté le 30-10-2003 à 08:16:23    

"%d", i tout court, étourdi que je suis:d... pas réveillé...


Message édité par fodger le 30-10-2003 à 08:17:05
Reply

Marsh Posté le 30-10-2003 à 09:51:47    

Ca vous dirait d'allouer un tableau de taille suffisante ? Vous avez oublié le '\0' terrminal là.
 
Et puis utilisez snprintf si possible, il y a assez de buffer overflow dans la nature comme ça, pas la peine d'en ajouter d'autres.


Message édité par Kristoph le 30-10-2003 à 09:51:57
Reply

Marsh Posté le 30-10-2003 à 11:55:09    

l'auteur voulait plutot un truc de ce style nan ?
(mettre un int "sous forme binaire", cad dans un char[4])
 

Code :
  1. int nb = 12;
  2. char str[4];
  3. memcpy(str, &nb, 4 * sizeof (char));


 
sinon je vois pas pkoi il parle de décalages au début...

Reply

Marsh Posté le 30-10-2003 à 12:02:02    

ou encore :
 

Code :
  1. typedef union {
  2. int n;
  3. char c[4];
  4. } montype;
  5. montype o;
  6. int x = ...;
  7. o.n = x;


et t'as ton résultat dans o.c[]
 
Mais ça dépendra de l'architecture sur laquelle tu travailles.

Reply

Marsh Posté le 30-10-2003 à 17:09:23    

Konar a écrit :

l'auteur voulait plutot un truc de ce style nan ?
(mettre un int "sous forme binaire", cad dans un char[4])
 

Code :
  1. int nb = 12;
  2. char str[4];
  3. memcpy(str, &nb, 4 * sizeof (char));


 
sinon je vois pas pkoi il parle de décalages au début...


 
 :jap: merci bien

Reply

Marsh Posté le 30-10-2003 à 23:19:44    

tiens voila une version plus mieux (au cas ou tes int sont pas sur 32 bits) :
 

Code :
  1. int nb = 12;
  2. char str[sizeof (int)];
  3. memcpy(str, &nb, sizeof (int));

Reply

Marsh Posté le 30-10-2003 à 23:19:44   

Reply

Marsh Posté le 30-10-2003 à 23:20:34    

Konar a écrit :

tiens voila une version plus mieux (au cas ou tes int sont pas sur 32 bits) :
 

Code :
  1. int nb = 12;
  2. char str[sizeof (int)];
  3. memcpy(str, &nb, sizeof (int));




 :love:  
 
 
 [:yamusha]  
ouais bon jlavais deja modifié

Reply

Marsh Posté le 30-10-2003 à 23:24:27    

Konar a écrit :

tiens voila une version plus mieux (au cas ou tes int sont pas sur 32 bits) :
 

Code :
  1. int nb = 12;
  2. char str[sizeof (int)];
  3. memcpy(str, &nb, sizeof (int));




 
Attention, sizeof(char) n'est pas forcement 1 !

Reply

Marsh Posté le 30-10-2003 à 23:28:22    

Kristoph a écrit :


 
Attention, sizeof(char) n'est pas forcement 1 !


 

Code :
  1. int nb = 12;
  2. char str[sizeof(int)/sizeof(char)+(sizeof(int)%sizeof(char)==0?0:1)];
  3. memcpy(str, &nb, sizeof(int)/sizeof(char)+(sizeof(int)%sizeof(char)==0?0:1));


 
[:must]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 30-10-2003 à 23:32:52    

SchnapsMann a écrit :


 

Code :
  1. int nb = 12;
  2. char str[sizeof(int)/sizeof(char)+(sizeof(int)%sizeof(char)==0?0:1)];
  3. memcpy(str, &nb, sizeof(int)/sizeof(char)+(sizeof(int)%sizeof(char)==0?0:1));


 
[:must]


[:al zheimer]

Reply

Marsh Posté le 30-10-2003 à 23:33:46    

SchnapsMann a écrit :


 

Code :
  1. int nb = 12;
  2. char str[sizeof(int)/sizeof(char)+(sizeof(int)%sizeof(char)==0?0:1)];
  3. memcpy(str, &nb, sizeof(int)/sizeof(char)+(sizeof(int)%sizeof(char)==0?0:1));


 
[:must]


 
C'est pas mal comme ça :)
 
Mais es ce que l'on ne pourrait pas se passer du "?0:1" ? Il me semble que par definition, (x==x) doit renvoyer soit 1 soit 0.

Reply

Marsh Posté le 30-10-2003 à 23:39:21    

Kristoph a écrit :


 
Attention, sizeof(char) n'est pas forcement 1 !


 
Si justement, sizeof(char) vaut toujours 1.
Par-contre, ce 1 ne signifie pas toujours 1 octet.
 
A+

Reply

Marsh Posté le 31-10-2003 à 02:03:48    

Encore une question :  
 
c du non signe -> 1 sera representé par  
 
01 00 00 00  
 
le prob c que je met ca dans une chaine de caractere donc au 1er caractere zero c fini
 
ya pas moyen de lavoir en signé ??

Reply

Marsh Posté le 31-10-2003 à 02:38:25    

tu rates de qqchose : c'est du binaire, donc ouais il peut y avoir des 00 un peu partout, par ex :
l'int "185270283" donne en binaire "11 00 11 11"
 
faut pas penser comme une chaine de caractere genre texte, mais plutot a une représentation d'octets de 0x00 a 0xFF, donc eviter les strlen et autres str***

Reply

Marsh Posté le 31-10-2003 à 15:59:40    

Le probleme c'est que sur platforme intel les octets des int32 sont inversé en mémoire.
int x;
char *c;
c=&x;
ca marche pas  :non:  
l'octet de poid faible se retrouve à gauche...
 
char c[4];
for(i=0;i<4;i++) c[i] = ((char *)&x)[3-i];
la tu as ton octet de poid faible à droite :)
 

Reply

Marsh Posté le 03-11-2003 à 00:28:35    

c'est pas que 'ca marche pas', mais plutot que suivant les systèmes, le bit de poids faible se retrouve a gauche ou a droite, par ex le nombre 13 s'écrira soit "0D 00 00 00" soit "00 00 00 0D". et je crois bien que j'ai rarement vu la 2nde solution.

Reply

Marsh Posté le 03-11-2003 à 00:37:33    

Konar a écrit :

c'est pas que 'ca marche pas', mais plutot que suivant les systèmes, le bit de poids faible se retrouve a gauche ou a droite, par ex le nombre 13 s'écrira soit "0D 00 00 00" soit "00 00 00 0D". et je crois bien que j'ai rarement vu la 2nde solution.


 
Je crois même qu'il y a des systèmes qui l'ecrivent comme ça :
 
"00 00 0D 00"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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