[C] Long to char ?

Yggdrasill

Membre actif
20 Octobre 2005
751
21
Liège - Belgique
Bonjour,

est-ce que qq1 sais comment je pourrais placer dans une chaine de char le contenu d'un long ?
Sous win, il existe bien la fonction "ltoa" mais elle n'est pas ansi et n'est pas compatible avec gcc... Comment faire ?

Merci !
 
Yggdrasill a dit:
Bonjour,

est-ce que qq1 sais comment je pourrais placer dans une chaine de char le contenu d'un long ?
Sous win, il existe bien la fonction "ltoa" mais elle n'est pas ansi et n'est pas compatible avec gcc... Comment faire ?

Merci !
qui n'est pas ANSI mais qui existe aussi avec gcc

tu as un FLAG gcc -ansi

sinon c'est évidemment ->sprintf
 
tatouille a dit:
tu as un FLAG gcc -ansi

Peux tu expliquer comment s'en ervir stp ?

Et merci pour sprintf, je ne connais pas tiens ça, jvais vite aller faire un tour dans la doc Apple.

EDIT :

Bloc de code:
char cc[20];
long a1;
(...)
sprintf(&cc,a1);
(...)

comme ceci ?

Elle est cool cette fonction ! pas de librairies en plus, c'est toujours bien :)
 
Pas tout à fait. Aide toi des pages man : dans le terminal "man sprintf"
Bloc de code:
     int
     sprintf(char * restrict str, const char * restrict format, ...);
Donc ce sera plutôt:
Bloc de code:
char cc[20];
long a1;
(...)
sprintf(&cc,"%i",a1);
(...)
 
Didier Guillion a dit:
Petite typo :

sprintf(cc,"%i",a1);

et non

sprintf(&cc,"%i",a1);

Cordialement

Merci de l'info mais je ne comprends pas, la proto nous dit bien qu'il faut un pointeur (ou en tout cas une adresse pour le premier champ.
Bloc de code:
int
     sprintf(char * restrict str, const char * restrict format, ...);

Sinon, pourquoi %i ?? Ne devrions nous pas mettre %ld pour un long ?

Merci !
 
Yggdrasill a dit:
Merci de l'info mais je ne comprends pas, la proto nous dit bien qu'il faut un pointeur (ou en tout cas une adresse pour le premier champ.
cc est du type char par contre cc est du type char*. En C un tableau est en fait un pointeur sur le premier élément du tableau.
Sinon, pourquoi %i ?? Ne devrions nous pas mettre %ld pour un long ?
Les explications sont dans la page man.
 
ntx a dit:
cc est du type char par contre cc est du type char*. En C un tableau est en fait un pointeur sur le premier élément du tableau.

Les explications sont dans la page man.



Apres verification, je peux faire comme j'ai tjs fait : au lieu de declarer un pointeur en plus, tu peux passer directement l'adresse de la "premiere case du tableau" puisque le pointeur ne fait que contenir cette derniere apres tout !

EDIT : Ah ben de toute façon si je travaille avec des long je ne peux pas utiliser de nombre a 20chiffres.... va falloir chercher apres un type plus grand !
 
Plus long que 64 bits ! Tu trouves ça où ? :siffle: A ma connaissance il n'y a pas de type entier 128 bits de défini, même si un Mac possède des unités de calcul 128 bits via l'altivec ou le SSE3. Je pense qu'il faut travailler avec deux nombres de 64 bits et faire un peu d'arithmétique pour les gérer comme un nombre de 128 bits. Regarde quand même les fonctions de calcul vectoriel.
 
Bloc de code:
float mem;
char *u;

u = "G";

char *_mem = (char *)malloc( sizeof(mem)*(int) + strlen(u) + 1 );
sprintf(_mem,"%.0f %sB", mem, (char *)u);

....

char *c = (char *)malloc(kernelversion[i]+1);
sprintf(c,"%c",kernelversion[i]);


sprintf(c,"%s -- %s -- %s -- %s -- %s -- %s -- %i","hello","\t","world","\t","!","\t","1024");
 
ntx a dit:
Plus long que 64 bits ! Tu trouves ça où ? :siffle: A ma connaissance il n'y a pas de type entier 128 bits de défini, même si un Mac possède des unités de calcul 128 bits via l'altivec ou le SSE3. Je pense qu'il faut travailler avec deux nombres de 64 bits et faire un peu d'arithmétique pour les gérer comme un nombre de 128 bits. Regarde quand même les fonctions de calcul vectoriel.


Je ne parlais pas de ça....
Ce que je voulais dire, c'est que un int te permet d'aller de -32000 et des a +32000 et des en codant le nombre sur 4 octet. Le long permet de jouer avec des nombres plus grands tjs sur 4 octet mais pourtant un nombre a 20chiffres, ben ca marche pas !
Je comprend pas trop pq tu viens parler de bit and co, et vu que j'assaye d'etre un maximum ansi je me passerait de toute instruction specifique visant a utiliser laltivec ou le sse3.

@ tatouille, oui tu as raison, c'est aussi ce que m'as retourner une recherche google, j'avais aussi pensé aux double mais les float conviennent largement. C'est parfait merci.

Reste plus qu'a finir le code maintenant :p enjoy !
 
Yggdrasill a dit:
Ce que je voulais dire, c'est que un int te permet d'aller de -32000 et des a +32000 et des en codant le nombre sur 4 octet. Le long permet de jouer avec des nombres plus grands tjs sur 4 octet mais pourtant un nombre a 20chiffres, ben ca marche pas !
Je comprend pas trop pq tu viens parler de bit and co, et vu que j'assaye d'etre un maximum ansi je me passerait de toute instruction specifique visant a utiliser laltivec ou le sse3.
2^32 = 1,84 10^19, donc un nombre de 19 chiffres au maximum :siffle:

ou encore :
8 bits = 0 à 255 (2^8) ou -127 à +128 en signé
16 bits = 0 à 65535 (2^16) ou -32767 à +32768 en signé
...
 
Yggdrasill a dit:
Ce que je voulais dire, c'est que un int te permet d'aller de -32000 et des a +32000 et des en codant le nombre sur 4 octet.

Euh, non, sous MacOS X, un int est sur 4 octets (32 bits), ce qui de fait environ +/- 2 milliards.
Peut-être as-tu l'habitude d'un système codant les int sur 16 bits. C'est l'un des inconvénients du C, il est faiblement typé.
 
Effectivement la taille des types short, int, long et long long peut varier suivant le processeur, si celui-ci est 8, 16, 32 ou 64 bits.
 
Euh, non, sous MacOS X, un int est sur 4 octets (32 bits), ce qui de fait environ +/- 2 milliards.
Peut-être as-tu l'habitude d'un système codant les int sur 16 bits. C'est l'un des inconvénients du C, il est faiblement typé.

C'est exactement ce que j'ai dit au dessus ;)
j'ai tjs programmé avec Xcode meme si il a du m'arriver de toucher a visual studio au debut par obligation scolaire. Quoi qu'il en soit dans les 2 cas les int sont codés sur 4 Octets.

ntx a dit:
2^32 = 1,84 10^19, donc un nombre de 19 chiffres au maximum :siffle:

ou encore :
8 bits = 0 à 255 (2^8) ou -127 à +128 en signé
16 bits = 0 à 65535 (2^16) ou -32767 à +32768 en signé
...


float,Flottant (réel) 4octets -> 3.4*10^-38 à 3.4*10^38

On s'en fou de coder mon nombre sur 2 octet, c'est trop petit, j'ai besoin de travailler avec des nombres de 20chiffres. Visiblement les float conviennent donc si on pouvais arreter le discourt sur le nombre de bit que chaque proco utilise pour coder les different types de variables...

Si vraiment ça en interesse Comment ça marche l'explique bien.
 
Euh, non, sous MacOS X, un int est sur 4 octets (32 bits), ce qui de fait environ +/- 2 milliards.
Peut-être as-tu l'habitude d'un système codant les int sur 16 bits. C'est l'un des inconvénients du C, il est faiblement typé.

//un int est sur 4 octets (32 bits)

SInt32[FONT=Verdana,Arial,Helvetica,sans-serif]
[/FONT]uint32_t
int

faite un sizeof

// int est sur 4 octets (32 bits)
mais c'est le cas sous d'autres systems :) ( 16-bit MS-DOS Subsystem[SIZE=-1] tu voulais dire :D ) [/SIZE]

// C'est l'un des inconvénients du C
oui mais il ya des types surdefinies c'est fait pour ça


:zen:

//j'ai besoin de travailler avec des nombres de 20chiffres

je flood heu float :D :D
 
Yggdrasill a dit:
On s'en fou de coder mon nombre sur 2 octet, c'est trop petit, j'ai besoin de travailler avec des nombres de 20chiffres. Visiblement les float conviennent donc si on pouvais arreter le discourt sur le nombre de bit que chaque proco utilise pour coder les different types de variables...

:mouais:On a tous du mal à te suivre aussi! Au début tu nous parles de long et après tu dis qu'il faut 20 chiffres, hors, ça ne rentre pas, et on essaye de t'expliquer pourquoi. Après ça, tu nous dis "ah mais oui, je sais déjà que ça rentre pas".

Si tu veux pouvoir stocker des nombres avec 20 chiffres décimaux significatifs ou jusqu'à 10^20, ça n'est pas la même démarche. Dans le premier cas, non, tu ne peux pas utiliser un float, parce que (je crois) qu'ils sont stockés sur 32 bits, il faudra peut-être utiliser un double, voire plus grand. Voilà pourquoi on te parle d'utiliser des types 128 bits.

Alors, reformule ta question, et nous nous ferons un plaisir d'y répondre.:zen:
 
:mouais:On a tous du mal à te suivre aussi! Au début tu nous parles de long et après tu dis qu'il faut 20 chiffres, hors, ça ne rentre pas, et on essaye de t'expliquer pourquoi. Après ça, tu nous dis "ah mais oui, je sais déjà que ça rentre pas".

Si tu veux pouvoir stocker des nombres avec 20 chiffres décimaux significatifs ou jusqu'à 10^20, ça n'est pas la même démarche. Dans le premier cas, non, tu ne peux pas utiliser un float, parce que (je crois) qu'ils sont stockés sur 32 bits, il faudra peut-être utiliser un double, voire plus grand. Voilà pourquoi on te parle d'utiliser des types 128 bits.

Alors, reformule ta question, et nous nous ferons un plaisir d'y répondre.:zen:

Effectivement, il me semble que je m'embrouille et le manque d'accent ne joue pas en ma faveur.


Ce que je veux faire, c'est travailler avec des nombres a 20 chiffres. Au debut, il me semblait que le long était le type qu'il me fallait, mais après avoir fait des test, j'ai remarquè que ça ne convenait pas, car au dela de nombre de plus de 11 chiffres j'ai des bug.
C'est pour ca qu'en allant voir sur commentcamarche.net (cfr le lien dans mon post précécent) j'ai vu que le float permet de travailler avec des nombres allant de 3,4*10^-38 à 3,4*10^38. Je n'ai pas encore eu le temps de faire des test, mais il me semble que ça fonctionnera.
Si qq1 a un autre type à me conseiller qu'il n'hésite pas.

Pour revenir a ma questio initiale, a savoir comment convertir un long en char, Tatouille y a répondu et sprintf semble convenir pour ce que je veux faire (placer le contenu d'une variable d'un type quelconque (pour le moment on va essayer avec des floats, mais ce sera peut-être un autre si vous m'en conseillez un autre) dans une chaine de char).

Désolé pour le manque de clareté et merci de votre patience.

EDIT : les nombres avec lesquel je dois travailler sont des nombre ENTIERS, donc pas de virgule, ni de décimales. Juste des entiers de 20chiffres.

Ex : 100 000 000 000 000 000 000 :D (c'est grand hein ?)
 
Yggdrasill a dit:
les nombres avec lesquel je dois travailler sont des nombre ENTIERS, donc pas de virgule, ni de décimales. Juste des entiers de 20chiffres.
Donc les entiers "long long" sur 64 bits ne sont pas suffisamment grands puisqu'ils s'arrêtent à 1,84 10^19, donc inférieur à 10^20. Par contre tu peux coupler deux entiers de 64 bits pour faire un entier de 128 bits et atteindre 10^20. C'est pour cela que je te disais de regarder du côté de l'altivec qui lui sait gérer des entiers de 128 bits.

Enfin sache qui si tu dépasses la capacité d'un type d'entier, ça recommence au début, ça boucle. C'est donc parfaitement gérable.
Yggdrasill a dit:
Ex : 100 000 000 000 000 000 000 :D (c'est grand hein ?)
Tu fais un code avec une clé aussi petite, ça ne tient pas 5 mn :D :D :D