# [C] Long to char ?



## Yggdrasill (7 Juillet 2006)

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 !


----------



## tatouille (7 Juillet 2006)

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


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

tu as un FLAG gcc -ansi 

sinon c'est &#233;videmment ->sprintf


----------



## Yggdrasill (8 Juillet 2006)

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 &#231;a, jvais vite aller faire un tour dans la doc Apple.

EDIT :


```
char cc[20];
long a1;
(...)
sprintf(&cc,a1);
(...)
```

comme ceci ?

Elle est cool cette fonction ! pas de librairies en plus, c'est toujours bien


----------



## ntx (8 Juillet 2006)

Pas tout à fait. Aide toi des pages man : dans le terminal "man sprintf"

```
int
     sprintf(char * restrict str, const char * restrict format, ...);
```
Donc ce sera plutôt:

```
char cc[20];
long a1;
(...)
sprintf(&cc,"%i",a1);
(...)
```


----------



## Didier Guillion (9 Juillet 2006)

Petite typo :

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

et non

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

Cordialement


----------



## Yggdrasill (9 Juillet 2006)

Didier Guillion a dit:
			
		

> Petite typo :
> 
> sprintf(cc,"%i",a1);
> 
> ...



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.

```
int
     sprintf(char * restrict str, const char * restrict format, ...);
```

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

Merci !


----------



## ntx (9 Juillet 2006)

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 ?
		
Cliquez pour agrandir...

Les explications sont dans la page man._


----------



## Yggdrasill (9 Juillet 2006)

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 &#233;l&#233;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&#231;on si je travaille avec des long je ne peux pas utiliser de nombre a 20chiffres.... va falloir chercher apres un type plus grand !_


----------



## ntx (9 Juillet 2006)

Plus long que 64 bits ! Tu trouves ça où ?  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.


----------



## tatouille (10 Juillet 2006)

```
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");
```


----------



## Yggdrasill (11 Juillet 2006)

ntx a dit:
			
		

> Plus long que 64 bits ! Tu trouves ça où ?  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  enjoy !


----------



## ntx (11 Juillet 2006)

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  

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


----------



## Céroce (11 Juillet 2006)

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


----------



## ntx (11 Juillet 2006)

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.


----------



## Yggdrasill (11 Juillet 2006)

C&#233 a dit:


> Euh, non, sous MacOS X, un int est sur 4 octets (32 bits), ce qui de fait environ +/- 2 milliards.
> Peut-&#234;tre as-tu l'habitude d'un syst&#232;me codant les int sur 16 bits. C'est l'un des inconv&#233;nients du C, il est faiblement typ&#233;.



C'est exactement ce que j'ai dit au dessus 
j'ai tjs programm&#233; 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&#233;s sur 4 Octets.



			
				ntx a dit:
			
		

> 2^32 = 1,84 10^19, donc un nombre de 19 chiffres au maximum
> 
> ou encore :
> 8 bits = 0 &#224; 255 (2^8) ou -127 &#224; +128 en sign&#233;
> ...






Comment &#231 a dit:


> float,Flottant (r&#233;el)	4octets -> 3.4*10^-38 &#224; 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 &#231;a en interesse Comment &#231;a marche l'explique bien.


----------



## tatouille (11 Juillet 2006)

C&#233 a dit:


> Euh, non, sous MacOS X, un int est sur 4 octets (32 bits), ce qui de fait environ +/- 2 milliards.
> Peut-&#234;tre as-tu l'habitude d'un syst&#232;me codant les int sur 16 bits. C'est l'un des inconv&#233;nients du C, il est faiblement typ&#233;.



//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  ) [/SIZE]

// C'est l'un des inconv&#233;nients du C
oui mais il ya des types surdefinies c'est fait pour &#231;a




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

je flood heu float


----------



## Céroce (11 Juillet 2006)

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.


----------



## Yggdrasill (11 Juillet 2006)

C&#233 a dit:


> :mouais:On a tous du mal &#224; te suivre aussi! Au d&#233;but tu nous parles de long et apr&#232;s tu dis qu'il faut 20 chiffres, hors, &#231;a ne rentre pas, et on essaye de t'expliquer pourquoi. Apr&#232;s &#231;a, tu nous dis "ah mais oui, je sais d&#233;j&#224; que &#231;a rentre pas".
> 
> Si tu veux pouvoir stocker des nombres avec 20 chiffres d&#233;cimaux significatifs ou jusqu'&#224; 10^20, &#231;a n'est pas la m&#234;me d&#233;marche. Dans le premier cas, non, tu ne peux pas utiliser un float, parce que (je crois) qu'ils sont stock&#233;s sur 32 bits, il faudra peut-&#234;tre utiliser un double, voire plus grand. Voil&#224; pourquoi on te parle d'utiliser des types 128 bits.
> 
> Alors, reformule ta question, et nous nous ferons un plaisir d'y r&#233;pondre.



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 &#233;tait le type qu'il me fallait, mais apr&#232;s avoir fait des test, j'ai remarqu&#232; que &#231;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&#233;c&#233;cent) j'ai vu que le float permet de travailler avec des nombres allant de 3,4*10^-38 &#224; 3,4*10^38. Je n'ai pas encore eu le temps de faire des test, mais il me semble que &#231;a fonctionnera.
Si qq1 a un autre type &#224; me conseiller qu'il n'h&#233;site pas.

Pour revenir a ma questio initiale, a savoir comment convertir un long en char, Tatouille y a r&#233;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-&#234;tre un autre si vous m'en conseillez un autre) dans une chaine de char).

D&#233;sol&#233; pour le manque de claret&#233; et merci de votre patience.

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

Ex : 100 000 000 000 000 000 000  (c'est grand hein ?)


----------



## ntx (11 Juillet 2006)

Yggdrasill a dit:
			
		

> les nombres avec lesquel je dois travailler sont des nombre ENTIERS, donc pas de virgule, ni de d&#233;cimales. Juste des entiers de 20chiffres.


Donc les entiers "long long" sur 64 bits ne sont pas suffisamment grands puisqu'ils s'arr&#234;tent &#224; 1,84 10^19, donc inf&#233;rieur &#224; 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&#244;t&#233; de l'altivec qui lui sait g&#233;rer des entiers de 128 bits.

Enfin sache qui si tu d&#233;passes la capacit&#233; d'un type d'entier, &#231;a recommence au d&#233;but, &#231;a boucle. C'est donc parfaitement g&#233;rable.


			
				Yggdrasill a dit:
			
		

> Ex : 100 000 000 000 000 000 000  (c'est grand hein ?)


Tu fais un code avec une cl&#233; aussi petite, &#231;a ne tient pas 5 mn


----------



## tatouille (11 Juillet 2006)

> Ex : 100 000 000 000 000 000 000  (c'est grand hein ?)



en Euros ca commence à être confortable
mais que veux tu faire ?


----------



## tatouille (11 Juillet 2006)

Citation:
Post&#233; par *Yggdrasill*
_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 &#233;l&#233;ment du tableau.
__ Citation:
                              Sinon, pourquoi %i ?? Ne devrions nous pas mettre %ld pour un long ?
 
 Les explications sont dans la page man.



		Bloc de code:
	

int main (int argc,const char * argv[])[FONT=Verdana,Arial,Helvetica,sans-serif]{[/FONT] 

    forward_2_a_funct((const char **) argv);

}

 _


----------



## Yggdrasill (12 Juillet 2006)

ntx a dit:
			
		

> Donc les entiers "long long" sur 64 bits ne sont pas suffisamment grands puisqu'ils s'arr&#234;tent &#224; 1,84 10^19, donc inf&#233;rieur &#224; 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&#244;t&#233; de l'altivec qui lui sait g&#233;rer des entiers de 128 bits.



Oui mais je veux que mon code soit ultra portable, il doit tourner exactement de la meme maniere sous win, Mac Os ou Linux. Donc l'alitivec je dois laisser de cot&#233;.



			
				ntx a dit:
			
		

> Tu fais un code avec une cl&#233; aussi petite, &#231;a ne tient pas 5 mn



Et c'est bien ce que j'esp&#232;re !



			
				tatouille a dit:
			
		

> en Euros ca commence &#224; &#234;tre confortable
> mais que veux tu faire ?



ca avoisine entre le pari d'amis, les tests et le plaisir de coder qqch de tordu, juste des traitements de nombres.

Par contre c'est clair que en euros... ca commence a devenir interessant ! De quoi se faire un beau parc de Xserve/G5 dans sa cave !


----------

