[c]Code format d'un double %f ou %lf ? Ou avoir + d'info sur long?

Code format d'un double %f ou %lf ? Ou avoir + d'info sur long? [c] - C - Programmation

Marsh Posté le 02-06-2004 à 01:56:13    

bon je suis un peu perdu  
 
Taz m'avais dis %f et le man 3 printf l'a comfirmé  
 
or le C que j'ai appris et sur le site  http://www.iota-six.co.uk/c/c2_printf_and_scanf.asp, c'est %lf !!!!
 
 
deplus d'apres le man, le float a completement disparu ....
 
bon normallement je dois plutot croire le man de mon syteme  
 
j'etais au courant a propos des int qui pouvait prendre soit 2 ou 4 octets  
mais la bizzare, ca me surprends .....
 
 
sinon comment puis je savoir sur combien de bits sont les int sur mon systeme, y a t'il une page man ?  
je dois pouvoir utiliser des nombre de 0 à 2 ^(32) -1  
donc normallement ca passe juste juste en non signé mais je pense utiliser des long pour etre tranquille mais quel code format utilisé ? %l ???
 
 
 
 

Citation :

MODIFICATEUR DE LONGUEUR
       Ici, une conversion entière correspond à d, i, o, u, x, ou X.
 
       hh     La conversion entière suivante correspond à un  signed  char  ou
              unsigned char, ou la conversion n suivante correspond à un argu-
              ment pointeur sur un signed char.
 
       h      La conversion entière suivante correspond  à  un  short  int  ou
              unsigned  short int, ou la conversion n suivante correspond à un
              argument pointeur sur un short int.
 
       l      (elle) La conversion entière suivante correspond à un  long  int
              ou  unsigned  long int, ou la conversion n suivante correspond à
              un pointeur sur un long int, ou la conversion c suivante  corre-
              spond  à  un argument wint_t, ou encore la conversion s suivante
              correspond à un pointeur sur un wchar_t.
 
       ll     (elle-elle) La conversion entière suivante correspond à un  long
              long int, ou unsigned long long int, ou la conversion n suivante
              correspond à un pointeur sur un long long int.
 
       L      La conversion a, A, e, E, f, F, g, ou G suivante correspond à un
              argument long double.  (C99 autorise %LF mais pas SUSv2).
 
       q      (`quad'  BSD 4.4 et Linux sous libc5 seulement, ne pas utiliser)
              Il s'agit d'un synonyme pour ll.
 
       j      La conversion entière suivante correspond à un argument intmax_t
              ou uintmax_t.
 
       z      La  conversion  entière suivante correspond à un argument size_t
              ou ssize_t.  (La bibliothèque libc5 de Linux  proposait  l'argu-
              ment Z pour cela, ne pas utiliser).
 
       t      La   conversion   entière  suivante  correspond  à  un  argument
              ptrdiff_t.


je suis assez impressionné par le nombre de type de valeur qui existe sur mon systeme  
h => short int  
I => long int  
ii => long long int
L => long double
 
je pense que c'est un long int qui me faudrait mais comment connaitre les plges de nombre que je peux utiliser ou sinon la taille des variables.  N'existe t'il pas de page man pour avoir un peu plus de precisions ?


Message édité par weed le 02-06-2004 à 01:57:01
Reply

Marsh Posté le 02-06-2004 à 01:56:13   

Reply

Marsh Posté le 02-06-2004 à 02:08:45    

Pour un double c'est %f qui est utilisé, le 'l' n'est applicable que sur des entiers et est ignoré.
Pour connaître le nombre d'octets, tu peux utiliser sizeof().
Sinon, généralement sur unix de nos jours et sauf erreur de ma part, les longs et int sont sur 32, les long long sur 64, les short sur 16.
Tu peux aussi utiliser les séries int64, int32, int16 ...

Reply

Marsh Posté le 02-06-2004 à 02:31:34    

En général (ce qui ne veux rien dire) les long sont 32 si compilés en 32 bits, et 64 si compilés en 64 bits. En général toujours, les int font 32 bits et les long long 64 bits, quel que soit le mode.
 
Pour connaître la taille en bits d'un type, fait « sizeof (type) * CHAR_BIT » (et oui, un char ne fait pas forcément 8 bits). Si tu veux juste savoir la plus grande quantité que peux contenir un type de base, utilise les INT_MAX, UINT_MAX...
 
Tout ça est dans limits.h et dépend de l'architecture.
 
Ah et puis pour réponde à ta question, ce n'est pas %l pour les long mais %ld ou %lu, suivant que tu veux du signé ou non signé. Et pour long long c'est %lld ou %llu. Les « l » et « ll » sont des modificateurs qui s'insèrent avant le type qui suit :D (d, u, x, X).


Message édité par matafan le 02-06-2004 à 02:34:56
Reply

Marsh Posté le 02-06-2004 à 02:42:58    

int32 t; n'a pas l'air de trop passer ...

Citation :

amusant/client.c:259: error: `int32' undeclared (first use in this function)
amusant/client.c:259: error: (Each undeclared identifier is reported only once
amusant/client.c:259: error: for each function it appears in.)
amusant/client.c:259: error: parse error before "t"


 
 
je viens de faire un petit sizeof vite fais et en effet tu as raison  
int et long => 32
long long => 64
mais alors a quoi ca sert le int ?
les bornes de int et de long sont bien  
0 -> 2^32 en non signé
ou en signé de - 2^32/2 -> 2^32/2

Reply

Marsh Posté le 02-06-2004 à 02:44:36    

oulala je me suis fais grilled
je regarderais ca demain  
merrci pour vos reponses

Reply

Marsh Posté le 02-06-2004 à 04:31:14    

Code :
  1. #include <sys/types.h>


Message édité par matafan le 02-06-2004 à 04:31:34
Reply

Marsh Posté le 02-06-2004 à 07:15:40    

vivelec a écrit :

Pour un double c'est %f qui est utilisé, le 'l' n'est applicable que sur des entiers et est ignoré.


 
weed > en fait, c'est simple, c'est juste que le format diffère à l'affichage et à la saisie
 
affichage -> %f pour les double et float (puisque le double va être converti)
lecture -> double %lf , float %f
 
vivelec > et me sort pas que c'est pas standard


Message édité par Taz le 02-06-2004 à 07:53:39
Reply

Marsh Posté le 02-06-2004 à 07:17:03    

matafan a écrit :

Code :
  1. #include <sys/types.h>



pas portable donc. y a tout ce qu'il faut en C99 dans <stdint.h>

Reply

Marsh Posté le 02-06-2004 à 08:20:13    

Taz a écrit :


affichage -> %f pour les double et float (puisque le double va être converti)


 
et ya pas un truc qui s'appelle la promotion des parametre et qui converti les float en double ou c'est juste c pre ansi (k&r) ?

Reply

Marsh Posté le 02-06-2004 à 08:35:08    

oups j'ai fait une erreur
 
-> (puisque le double^Wfloat va être converti)  
 
si. mais uniquement en entrée évidemment, ton float* tu peux le faire passer en double*, mais ça cassera. dans l'autre sens aussi.

Reply

Marsh Posté le 02-06-2004 à 08:35:08   

Reply

Marsh Posté le 02-06-2004 à 08:42:58    

ok

Reply

Marsh Posté le 02-06-2004 à 09:01:30    

Taz a écrit :

weed > en fait, c'est simple, c'est juste que le format diffère à l'affichage et à la saisie
 
affichage -> %f pour les double et float (puisque le double va être converti)
lecture -> double %lf , float %f
 
vivelec > et me sort pas que c'est pas standard


Tout dépend de tes standards ...
Sous UNIX et non sous linux, effectivement ce n'est pas "standard", du moins, le 'l' est ignoré.

Reply

Marsh Posté le 02-06-2004 à 16:55:03    

oki je comprends mieux  
merci a vous tous ...
 
j'ai fais comme a dis matafan :

Code :
  1. printf("\nINT_MAX %d, UINT_MAX %u, LONG_MAX %ld",INT_MAX,UINT_MAX,LONG_MAX);


 
mais que vois je :

Code :
  1. INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647


int = long = (2^32)/2-1
est ce que je me suis trompé ?
sinon pour info :

Code :
  1. [weed@localhost include]$ cat limits.h | grep MAX
  2. #define MB_LEN_MAX      16
  3. #  define SCHAR_MAX     127
  4. #  define UCHAR_MAX     255
  5. #   define CHAR_MAX     UCHAR_MAX
  6. #   define CHAR_MAX     SCHAR_MAX
  7. #  define SHRT_MAX      32767
  8. #  define USHRT_MAX     65535
  9. #  define INT_MIN       (-INT_MAX - 1)
  10. #  define INT_MAX       2147483647
  11. #  define UINT_MAX      4294967295U
  12. #   define LONG_MAX     9223372036854775807L
  13. #   define LONG_MAX     2147483647L
  14. #  define LONG_MIN      (-LONG_MAX - 1L)
  15. #   define ULONG_MAX    18446744073709551615UL
  16. #   define ULONG_MAX    4294967295UL
  17. #   define LLONG_MAX    9223372036854775807LL
  18. #   define LLONG_MIN    (-LLONG_MAX - 1LL)
  19. #   define ULLONG_MAX   18446744073709551615ULL
  20.    LLONG_MAX, and ULLONG_MAX.  Instead only the values gcc defined for
  21. #  ifndef LLONG_MAX
  22. #   define LLONG_MAX    LONG_LONG_MAX
  23. #  ifndef ULLONG_MAX
  24. #   define ULLONG_MAX   ULONG_LONG_MAX


Message édité par weed le 02-06-2004 à 16:57:53
Reply

Marsh Posté le 02-06-2004 à 20:29:46    

Qu'est-ce qui ne te semble pas normal ?

Reply

Marsh Posté le 02-06-2004 à 20:32:19    

vivelec a écrit :

Tout dépend de tes standards ...
Sous UNIX et non sous linux, effectivement ce n'est pas "standard", du moins, le 'l' est ignoré.

et allez, ça repart ... non mais non seulement de raconter des conneries tu dis des trucs dangereux. et tu te dis expert ? et ben mon Dieu !
 
%lf est tout a fait standard et ANSI
 
tu commences à nous saouler : ON EN A RIEN A FOUTRE SI T'ES TROP NUL POUR T'INSTALLER UN COMPILATEUR C

Reply

Marsh Posté le 02-06-2004 à 20:32:57    

matafan a écrit :

Qu'est-ce qui ne te semble pas normal ?

rien, sur système 32 bits, il se trouve que sizeof(long) == sizeof(int)

Reply

Marsh Posté le 02-06-2004 à 23:03:16    

Taz a écrit :

et allez, ça repart ... non mais non seulement de raconter des conneries tu dis des trucs dangereux. et tu te dis expert ? et ben mon Dieu !
 
%lf est tout a fait standard et ANSI
 
tu commences à nous saouler : ON EN A RIEN A FOUTRE SI T'ES TROP NUL POUR T'INSTALLER UN COMPILATEUR C


Qu'est-ce qu'elle a la petite merde ?
T'as tes règles ?
Prends du spafon cocotte et fais pas chier.
 

Reply

Marsh Posté le 02-06-2004 à 23:05:05    

Taz a écrit :

rien, sur système 32 bits, il se trouve que sizeof(long) == sizeof(int)


Et je dirais que petite merde encore, sur 64 bits c'est la même chose.
Il n'y a plus de distinction entre le int et le long depuis que l'on a tous migré sur des archis en 32 bits.

Reply

Marsh Posté le 02-06-2004 à 23:11:53    

vivelec a écrit :

Qu'est-ce qu'elle a la petite merde ?
T'as tes règles ?
Prends du spafon cocotte et fais pas chier.


 
ce serait cool de rester poli.
 
[:shakalagoons]

Reply

Marsh Posté le 02-06-2004 à 23:16:17    

black_lord a écrit :

ce serait cool de rester poli.
 
[:shakalagoons]


Ce n'est qu'un échange de bon procédés avec Taz.
Rien de bien méchant.

Reply

Marsh Posté le 02-06-2004 à 23:45:32    

"Qu'est-ce qui ne te semble pas normal ? "
 
ce que retourne INT_MAX et LONG_MAX c'est qui me chagrine :
  INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647
 
long sert strictement a rien alors ???? si c'est tous les 2 : 2147483647
c'est bien 32 bits 2^32/2-1, je pensais que la taille ne voulait rien dire du fait que int ne soit pas compilé et le long compilé et que INT_MAX < LONG_MAX
 
mais il y a un long beaucoup plus long (ouou, le jeux de mots ;) )  

Citation :

#  define INT_MAX       2147483647  
 #   define LONG_MAX     9223372036854775807L # <====
 #   define LONG_MAX     2147483647L


Message édité par weed le 02-06-2004 à 23:50:50
Reply

Marsh Posté le 02-06-2004 à 23:47:46    

et puis SVP, restez calme  
je ne sais pas qui a raison, mais que vous avez tous les 2, vivelec et taz, un tres tres bon niveau en linux/unix

Reply

Marsh Posté le 02-06-2004 à 23:51:34    

weed a écrit :

et puis SVP, restez calme  
je ne sais pas qui a raison, mais que vous avez tous les 2, vivelec et taz, un tres tres bon niveau en linux/unix


Ce n'est pas une question d'avoir un bon niveau ou non, les métiers de l'informatique sont diverses et à chacun sa spécialité.
Cependant, la courtoisie et le respect sont des minimums, tant qu'ils sont réciproques.
Ce qui n'est pas toujours le cas.

Reply

Marsh Posté le 02-06-2004 à 23:53:56    

weed a écrit :

"Qu'est-ce qui ne te semble pas normal ? "
 
ce que retourne INT_MAX et LONG_MAX c'est qui me chagrine :
  INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647
 
long sert strictement a rien alors ???? si c'est tous les 2 : 2147483647
c'est bien 32 bits 2^32/2-1, je pensais que la taille ne voulait rien dire du fait que int ne soit pas compilé et le long compilé et que INT_MAX < LONG_MAX
 
mais il y a un long beaucoup plus long (ouou, le jeux de mots ;) )  

Citation :

#  define INT_MAX       2147483647  
 #   define LONG_MAX     9223372036854775807L # <====
 #   define LONG_MAX     2147483647L




Cela ressemble à du linux.
Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire.

Reply

Marsh Posté le 02-06-2004 à 23:59:16    

"Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire. "
 
dsl mais je comprends pas du tout  
ou vois tu de l'hexa et pourquoi me parle de binaire ?

Reply

Marsh Posté le 03-06-2004 à 00:12:26    

weed a écrit :

"Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire. "
 
dsl mais je comprends pas du tout  
ou vois tu de l'hexa et pourquoi me parle de binaire ?


Tu remarqueras par exemple que 9223372036854775807L correspond à 7FFFFFFFFFFFFFFF qui correspond donc à la valeur max d'un 64 bits signé, soit -9223372036854775807 à +9223372036854775807.
Sur un 64 bits non signé, tu aurais droit à la plage 0 - 18446744073709551615.
Sur la majorité des plateformes, le bit de signe est en effet positionné sur le bit de poids fort.
Généralement, pour tout ce qui a trait à la manipulation de bits ou d'octets, on choisit l'octal ou l'héxa.

Reply

Marsh Posté le 03-06-2004 à 00:18:31    

vivelec a écrit :

Et je dirais que petite merde encore, sur 64 bits c'est la même chose.
Il n'y a plus de distinction entre le int et le long depuis que l'on a tous migré sur des archis en 32 bits.

mais dis donc, tu me parais avoir une sacré expérience mon gars ... manqué sur beaucoup d'architecture 64bits, l'int fait 32bits et le le long fait nativement 64bits.

Reply

Marsh Posté le 03-06-2004 à 00:21:45    

vivelec a écrit :

Cela ressemble à du linux.
Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire.

ah ouais, moi aussi, je reconnais cette manière d'indenter.
 
weed > il est bizarre ton limits.h ...
 
cela dit, la norme impose que sizeof(int) <= sizeof(long) <= sizeof(long long)
 
sur X86 32bits, l'int et le long font 32bits, le long long 64bits, le contrat est respecté

Reply

Marsh Posté le 03-06-2004 à 00:28:50    

Taz a écrit :

mais dis donc, tu me parais avoir une sacré expérience mon gars ... manqué sur beaucoup d'architecture 64bits, l'int fait 32bits et le le long fait nativement 64bits.


Es-tu vraiment sûr de ce que tu annonces ?
Ceci dit, je commençais à déspérer de ton absence.
Mais suis-je bête, on est jeudi, jour de congé pour les estudiantains !
Tes injures m'ont manquées à vrai dire.
Encore !

Reply

Marsh Posté le 03-06-2004 à 00:35:18    

oui

Reply

Marsh Posté le 03-06-2004 à 00:38:51    


En fait, et là, si tu as les preuves qui vont bien et pas sur linux, stp, les int et les longs sont codés sur 32 bits quelque soit la plateforme.
Ceci dit, j'aurais tendance à croire la même que toi.

Reply

Marsh Posté le 03-06-2004 à 00:41:24    

vivelec a écrit :

En fait, et là, si tu as les preuves qui vont bien et pas sur linux, stp, les int et les longs sont codés sur 32 bits quelque soit la plateforme.
Ceci dit, j'aurais tendance à croire la même que toi.

K&R. il a juste une relation d'ordre imposé entre les tailles et des capacité minimales à fournir. on trouve donc des architectures où sizeof(int) == 4 et donc sizeof(long) == sizeof(void*) == 8

Reply

Marsh Posté le 03-06-2004 à 00:58:02    

et bien en tout cas  
je suis vraimenent decu  
j'ai eu l'occasion de programmer sur du C borland sous win32sur une  architecture 32 bits, c'est peut etre pas du C trop standard mais le long etait plus long que ca ...  
 
bon allez bonne nuit

Reply

Marsh Posté le 03-06-2004 à 01:21:45    

Taz a écrit :

K&R. il a juste une relation d'ordre imposé entre les tailles et des capacité minimales à fournir. on trouve donc des architectures où sizeof(int) == 4 et donc sizeof(long) == sizeof(void*) == 8


Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.

Reply

Marsh Posté le 03-06-2004 à 01:28:48    

vivelec a écrit :

Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.

déjà je parle de sizeof(void*) et sur un système 64bits, encore heureux que sizeof(void*) == 8 :o

Reply

Marsh Posté le 03-06-2004 à 01:31:12    

vivelec a écrit :

Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.


 
tiens :
http://www.codeproject.com/cpp/FastDelegate.asp
 
matte un coup le chapitre "Implementations of Member Function Pointers"
la colonne "DataPtr"
 
 
[edit] oups, c'est du C++, mais bon la remaque reste valide


Message édité par SquiZZ le 03-06-2004 à 01:33:15
Reply

Marsh Posté le 03-06-2004 à 01:33:50    

SquiZZ a écrit :

tiens :
http://www.codeproject.com/cpp/FastDelegate.asp
 
matte un coup le chapitre "Implementations of Member Function Pointers"
la colonne "DataPtr"
 
 
[edit] oups, c'est du C++, mais bon la remaque reste valide

ah ben non, et ho, les systèmes 64bits, faudrait pas non plus qu'ils puissent addresser 64bits :o

Reply

Marsh Posté le 03-06-2004 à 01:40:05    

[:itm]

Reply

Marsh Posté le 03-06-2004 à 01:41:23    

Taz a écrit :

ah ben non, et ho, les systèmes 64bits, faudrait pas non plus qu'ils puissent addresser 64bits :o


Donne-moi alors un vrai os 64 bitd, et je teste.
Rien ne vaut l'empirisme ..

Reply

Marsh Posté le 03-06-2004 à 01:42:05    

vivelec a écrit :

Donne-moi alors un vrai os 64 bitd, et je teste.
Rien ne vaut l'empirisme ..


Oups, j'oubliais, tout sauf linux.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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